Actualmente estoy trabajando en un programa MFC que específicamente tiene que trabajar con UTF-8. En algún momento, tengo que escribir datos UTF-8 en un archivo; para hacer eso, estoy usando CFiles y CStrings.UTF-8, CString y CFile? (C++, MFC)
Cuando llego a escribir UTF-8 (caracteres rusos, para ser más precisos) de datos en un archivo, la salida se ve como
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
y etc. Esto no es assurely UTF-8. Para leer estos datos correctamente, tengo que cambiar la configuración de mi sistema; cambiar los caracteres que no son ASCII a una tabla de codificación rusa funciona, pero luego todos mis caracteres latinos que no son ASCII fallan. De todos modos, así es como lo hago.
CFile CSVFile(m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
¿Falta algo? ¿Debo usar algo más en su lugar? ¿Hay algún tipo de captura que me haya perdido? Seré sintonizado por su sabiduría y experiencia, compañeros programadores.
EDIT: Por supuesto, como acabo de hacer una pregunta, finalmente encuentro algo que podría ser interesante, que se puede encontrar here. Pensé que podría compartirlo.
EDIT 2:
bien, así que añaden a la lista de materiales mi archivo, que ahora contiene caracteres chineese, probablemente porque no me convierto mi línea a UTF-8. Para añadir la lista de materiales que hice ...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
Y después de eso, añadí ...
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);
Pero entonces no puedo compilar, ya que no se sabe muy bien cómo sacar el longitud de TestLine. strlen no parece aceptar TCHAR. Solucionado, usó una longitud estática de 1000 en su lugar.
Datos 3:
Por lo tanto, he añadido el código ...
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);
Se compila bien, pero cuando voy vistazo a mi nuevo archivo, que es exactamente lo mismo que cuando yo no' Tengo todo este código nuevo (por ejemplo: Ðàñïå ÷ àòàíî :). Siento que no di un paso adelante, aunque creo que solo una pequeña cosa es lo que me separa de la victoria.
EDITAR 4:
He quitado previamente añadido código, tal como pidió Nate, y decidió utilizar su código en su lugar, lo que significa que ahora, cuando llegue a añadir mi línea, no tengo ...
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
Todo compila bien, pero los caracteres rusos se muestran como ???????. Acercarse, pero aún no eso. Por cierto, me gustaría agradecer a todos los que intentaron/intentaron ayudarme, es MUCHO apreciado. He estado atrapado en esto por un tiempo, no puedo esperar a que este problema desaparezca. FINAL EDIT (Espero) Al cambiar la forma en que obtuve por primera vez mis caracteres UTF-8 (volví a codificar sin saber), lo cual era erróneo con mi nueva forma de mostrar el texto, obtuve resultados aceptables.Al agregar el carácter UTF-8 BOM al principio de mi archivo, podría leerse como Unicode en otros programas, como Excel.
¡Hurra! ¡Gracias a todos!
Deberá usar _tcslen para obtener la longitud de una cadena TCHAR. Me gusta: \t TCHAR * testTCHAR = _T ("prueba"); \t int tcharLength = _tcslen (testTCHAR); –
Además, si necesita convertir un CString en una cadena TCHAR * intente esto \t CString testCString = _T ("test"); \t TCHAR * testTCHAR = testCString.GetBuffer(); –
Estás trabajando demasiado. Use 'CT2CA' con un segundo parámetro de' CP_UTF8'. Ver mi publicación a continuación. – Nate