[ Djoks @ 15.02.2005. 09:17 ] @
Pozdrav narode!

Evo jednog MFC VC++ početničkog pitanja:

Imam UTF8 tekstualni fajl, koji parsiram i sadržaj pišem u HTML fajl. Nažalost, ukoliko se u input-fajlu pronađe neki simbol tipa ščćž, u output-u se pojavljuju čudni znakovi iz asci koda.

Evo mog primjera:

Code:

CStdioFile cf;
if(cf.Open("c:\\temp\\fajl.xml", CFile::modeRead))
{
    int nFileLength = cf.GetLength();
    char *lpBuffer = new char[nFileLength+1];
    try
    {
        cf.Read(lpBuffer, nFileLength);
    } 
    catch (CFileException *e) 
    {
        e->Delete();
        delete [] lpBuffer;
    }
    lpBuffer[nFileLength] = 0;
    CString sadrzaj;
    
    sadrzaj = lpBuffer;
    delete [] lpBuffer;
    cout << (LPCTSTR)sadrzaj << endl;
}


Ukoliko fajl.xml sadržaj izgleda ovako: "cvrči cvrči čvorak...", izlaz izgleda ovako: "cvr─Źi cvr─Źi ─Źvorak..."


Kako da prevaziđem problem?

Đorđe
+++[code][code]
[ Dragi Tata @ 15.02.2005. 15:50 ] @
To je zato što čitaš UTF-8 tekst kao da je ASCII. U principu, treba da odradiš sledeće:

1. Otvoriš fajl u binarnom modu i učitaš sadržaj u niz bajtova (najbolje je da koristiš std::vector).

2. Uz pomoć funkcije MultiByteToWideChar konvertuješ tako učitan tekst u UTF16 i smestiš ga u npr wstring.

3. Parsiraš ili već šta hoćeš da radiš sa tim tekstom.

4. Konvertuješ rezultat u UTF-8 tekst kao niz bajtova pomoću funkcije WideCharToMultiByte

5. Zapišeš rezultat u novi fajl (binarno).
[ sspasic @ 15.02.2005. 17:14 ] @
Svakako uradi na način kako kaže Dragi Tata, zbog jednostavnijeg parsiranja kada karakteri imaju jednaku veličinu, ali mislim da ti ovde problem pravi to što na cout šalješ UTF-8 tekst a Command Prompt prozor očekuje ASCII.