Attualmente sto lavorando a un programma MFC che deve funzionare specificamente con UTF-8. Ad un certo punto, devo scrivere i dati UTF-8 in un file; per farlo, sto usando CFiles e CStrings.UTF-8, CString e CFile? (C++, MFC)
Quando arrivo di scrivere utf-8 (caratteri russi, per essere più precisi) dati in un file, l'output si presenta come
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
e ecc Questo non è assurely utf-8. Per leggere correttamente questi dati, devo modificare le mie impostazioni di sistema; cambiare i caratteri non ASCII in una tabella di codifica russa funziona, ma poi tutti i miei caratteri non-ascii basati su latino falliscono. Ad ogni modo, è così che lo faccio.
CFile CSVFile(m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
Mi manca qualcosa? Devo usare qualcos'altro, invece? C'è una specie di cattura che ho perso? Sarò sintonizzato per la tua saggezza ed esperienza, colleghi programmatori.
MODIFICA: Naturalmente, come ho appena fatto una domanda, ho finalmente trovato qualcosa che potrebbe essere interessante, che può essere trovato here. Ho pensato che potrei condividerlo.
EDIT 2:
Va bene, così ho aggiunto la distinta al mio file, che ora contiene il carattere chineese, probabilmente perché non ho convertire la mia linea in UTF-8. Per aggiungere il bom ho fatto ...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
E dopo questo, ho aggiunto ...
TCHAR TestLine;
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,sWorkingLine,sWorkingLine.GetLength(),TestLine,strlen(TestLine)+1,NULL,NULL);
//Add the line to file.
CSVFile.Write(TestLine,strlen(TestLine)+1);
Ma poi non riesco a compilare, come io non so davvero come ottenere il lunghezza di TestLine. strlen non sembra accettare TCHAR. Risolto, utilizzato invece una lunghezza statica di 1000.
EDIT 3:
Così, ho aggiunto questo codice ...
wchar_t NewLine[1000];
wcscpy(NewLine, CT2CW((LPCTSTR) sWorkingLine));
TCHAR* TCHARBuf = new TCHAR[1000];
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,NewLine,1000,TCHARBuf,1000,NULL,NULL);
//Find how many characters we have to add
size_t size = 0;
HRESULT hr = StringCchLength(TCHARBuf, MAX_PATH, &size);
//Add the line to the file
CSVFile.Write(TCHARBuf,size);
Si compila bene, ma quando vado sguardo al mio nuovo file, è esattamente la stessa di quando ho didn' Ho tutto questo nuovo codice (es: Ðàñïå ÷ àòàíî :). Mi sembra di non aver fatto un passo avanti, anche se immagino che solo una piccola cosa sia ciò che mi separa dalla vittoria.
EDIT 4:
ho rimosso in precedenza codice aggiunto, come ha chiesto Nate, e ho deciso di utilizzare il suo codice, invece, il che significa che ora, quando arrivo a aggiungere la mia linea, ho ...
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
Tutto si compila bene, ma i caratteri russi sono mostrati come ???????. Avvicinarsi, ma ancora non quello. Btw, vorrei ringraziare tutti coloro che hanno provato/cercano di aiutarmi, è MOLTO apprezzato. Sono stato bloccato su questo per un po 'di tempo, non vedo l'ora che questo problema sparisca.
FINAL EDIT (spero) Cambiando il modo in cui ho ottenuto i miei caratteri UTF-8 (reencoded senza sapere veramente), che era errato con il mio nuovo modo di emettere il testo, ho ottenuto risultati accettabili.Aggiungendo il carattere BOM UTF-8 all'inizio del mio file, potrebbe essere letto come Unicode in altri programmi, come Excel.
Evviva! Grazie a tutti!
Avrete bisogno di usare _tcslen per ottenere la lunghezza di una stringa TCHAR. Come: \t TCHAR * testTCHAR = _T ("test"); \t int tcharLength = _tcslen (testTCHAR); –
Anche se è necessario convertire un CString in una stringa TCHAR *, provare questo \t CString testCString = _T ("test"); \t TCHAR * testTCHAR = testCString.GetBuffer(); –
Stai lavorando troppo duramente. Usa 'CT2CA' con un secondo parametro di' CP_UTF8'. Vedi il mio post qui sotto. – Nate