В настоящее время я работаю над программой MFC, которая специально работает с UTF-8. В какой-то момент я должен записать данные UTF-8 в файл; Для этого я использую CFiles и CStrings.
Когда я записываю в файл данные utf-8 (точнее, русские символы), вывод выглядит как
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
и т. Д. Это, конечно, не utf-8. Чтобы правильно прочитать эти данные, мне нужно изменить системные настройки; замена не-ASCII-символов на русскую таблицу кодирования работает, но тогда все мои латинские не-ASCII-символы дают сбой.
Во всяком случае, так я это делаю.
CFile CSVFile( m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
Я что-то упустил? Должен ли я использовать что-то еще вместо этого? Есть ли какой-то улов, который я пропустил?
Я буду настроен на вашу мудрость и опыт, коллеги-программисты.
EDIT:
Конечно, когда я только что задал вопрос, я наконец-то нашел кое-что интересное, что можно найти здесь . Думаю, я мог бы поделиться этим.
РЕДАКТИРОВАТЬ 2:
Хорошо, поэтому я добавил спецификацию в свой файл, который теперь содержит китайский символ, возможно, потому что я не конвертировал свою строку в UTF-8. Чтобы добавить бомбу я сделал ...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
И после этого я добавил ...
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);
Но тогда я не могу скомпилировать, так как я не знаю, как получить длину TestLine. Стрлен, кажется, не принимает TCHAR.
Исправлено, вместо этого использовалась статическая длина 1000.
РЕДАКТИРОВАТЬ 3:
Итак, я добавил этот код ...
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);
Он прекрасно компилируется, но когда я смотрю на мой новый файл, он точно такой же, как и когда у меня не было всего этого нового кода (например: я не знаю :)). Такое ощущение, что я не сделал ни шагу вперед, хотя, полагаю, только мелочь отделяет меня от победы.
РЕДАКТИРОВАТЬ 4:
Я удалил ранее добавленный код, как и спросил Нейт, и решил вместо этого использовать его код, то есть теперь, когда я добавляю свою строку, у меня есть ...
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
Все компилируется нормально, но русские символы отображаются как ??????? Все ближе, но все же не то.
Кстати, я хотел бы поблагодарить всех, кто пытался / пытается помочь мне, это очень ценится. Я застрял на этом некоторое время, я не могу дождаться, когда эта проблема исчезнет.
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ (надеюсь)
Изменив способ, которым я впервые получил свои символы UTF-8 (я перекодировал без особого знания), что было ошибочным с моим новым способом вывода текста, я получил приемлемые результаты. Добавив символ UTF-8 BOM в начало моего файла, он может быть прочитан как Unicode в других программах, таких как Excel.
Ура! Спасибо всем!