» »

[C++] charset-a

[C++] charset-a

matijaz74 ::

Pozdravljni! Imam problem z spreminjanjem charste-a niza. V bazi Mysql imam charset utf-8. Delam v linux-u Ubuntu. Imam 25MB tekstovno datoteko, iz katere bi rad prebral podatke, jih razčlenil in shranil v Mysql bazo. Vnašanje in branje iz mysql baze gre super. Vendar tekstovna datoteka ima charset window-1250 baza pa utf-8. Sedaj bi rad da tekst spremeni v iz window-1250 v utf-8. Najdel sem neko funkcijo 'iconv' upam, da je taprava vendar koda ki sem jo najdel na netu ne deluje. Ali kdo pozna kakšno drugo rešitev ali pa če je kakšen simple primer na netu, če mi posreduje, ker sem že vse pregledal pa ni uspeha. Hvala vam za pomoč.
lp
Matijaž

krneki0001 ::

uporabi pretvorbo. Ko iz datoteke prebereš vrstico, jo pretvori v utf8 in jo potem zapiši v bazo.

v ruby-ju gre nekako takole
# encoding: UTF-8
 
vrstica.force_encoding("ISO-8859-1").encode("UTF-8")


v C++ u pa nekako takole

metoda to_utf8
#include < windows.h >
std::string to_utf8(const wchar_t* buffer, int len)
{
        int nChars = ::WideCharToMultiByte(
                CP_UTF8,
                0,
                buffer,
                len,
                NULL,
                0,
                NULL,
                NULL);
        if (nChars == 0) return "";

        string newbuffer;
        newbuffer.resize(nChars) ;
        ::WideCharToMultiByte(
                CP_UTF8,
                0,
                buffer,
                len,
                const_cast< char* >(newbuffer.c_str()),
                nChars,
                NULL,
                NULL); 

        return newbuffer;
}

std::string to_utf8(const std::wstring& str)
{
        return to_utf8(str.c_str(), (int)str.size());
}


še main
int main()
{
        std::ofstream testFile;

        testFile.open("demo.xml", std::ios::out | std::ios::binary); 

        std::wstring text =
                L"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n"
                L"< root description=\"this is a na?ve example\" >\n< /root >";

        std::string outtext = to_utf8(text);

        testFile << outtext;

        testFile.close();

        return 0;
}
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

SasoS ::

WideCharToMultiByte pa ne bo šlo v Ubuntuju :D

Ali iconv, ali pa začasno na bazi zamenjaj charset pa pusti da ti baza naredi pretvorbo:

set names 'cp1250'
insert into ...
set names 'utf8'

zhigatsey ::

Ali pa metoda mysql_set_character_set...

matijaz74 ::

Hvala, vam. Rešitev sem najdel v Mysql. Rešitev je bila ta da sem pri odprtju baze podal ukaz: SET CHARACTER SET utf8 in se je zapisalo tako kot je treba. Brez napak. Za kontra pa nisem najdel rešitve. probal sem z iconv pa mi je skripta prezakomplicirana da bi jo razumel.
lp
Matijaž

zhigatsey ::

Ni važno če je baza utf8, če vzpostaviš connection s charsetom npr win1250, se bodo vrednosti ob insertih in selectih samodejno pretvarjali
iz utf8 v win1250 in obratno... tako ne rabiš nobene zunanje knjižnjice...

Klobasa ::

c++

boost lexical_cast specializacija

namespace boost
{

template<> inline std::string boost::lexical_cast<std::string, std::wstring>(const std::wstring& arg)
{
	std::string res( "" );
	std::locale foo( std::locale::classic() );

	for ( std::wstring::size_type i = 0; i < arg.size(); ++i )
	{
		res.push_back( std::use_facet< std::ctype < wchar_t > >( foo ).narrow( arg.at( i ) ) );
	}

	return res;
}
template<> inline std::wstring boost::lexical_cast<std::wstring, std::string>(const std::string& arg)
{
	std::wstring res( L"" );
	std::locale foo( std::locale::classic() );

	for( std::string::size_type i = 0; i < arg.size(); ++i )
	{
		res.push_back( std::use_facet< std::ctype < wchar_t > >( foo ).widen( arg.at( i ) ) );
	}

	return res;
}

}

SasoS ::

Moraš pa malo pazit, da se podatki v bazo res zapišejo tako kot želiš...mysql je tu malo kompliciran in je treba premislit. Ima vsaj 3 različna mesta, kjer se (hote ali nehote) pretvorba dogaja. Najprej sama definicija baze (oz tabel)...če ta ni utf8, potem bo mysql pretvarjal v latin1 (ki je AFAIK še vedno default) pri vsakem vpisu ne glede kaj mu ti pošiljaš in kako nastaviš character set. Potem je charset povezave in klienta, ki se nastavlja z character set...če se te 3 vrednosti ujemajo, sam mysql pretvorbe ne bo delal, še vedno pa to ne pomeni da si v bazo dajal tisto kar si hotel. Ogromno baz sem videl, kjer je bilo vse default, latin1, klienti pa so veselo vpisovali utf8. Ker so (posamezni) utf8 znaki veljavne latin1 črke se baza ne bo nič pritožla....potem so pa res rabli utf8, se je pa pretvarjalo celo bazo...
Če imaš text res v cp1250, potem se potrudi in preveri da je to kar pristane v bazi res utf8, in ni važno kaj boš rabil ven, vedno se bo dalo dobiti.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[php] encoding niza

Oddelek: Izdelava spletišč
173815 (1730) BivšiUser2
»

[C++] Slovenski znaki v Command Promptu

Oddelek: Programiranje
133337 (3041) Makronaut
»

[C++] Unicode, Utf...

Oddelek: Programiranje
61507 (1390) Matako
»

[C++] Pretvorba iz int v char *

Oddelek: Programiranje
232968 (2344) Gundolf
»

win api (c++)

Oddelek: Programiranje
462548 (1828) Gundolf

Več podobnih tem