UTF-8, CString и CFile? (C++, MFC)

Я в настоящее время работаю над программой MFC, которая конкретно должна работать с UTF-8. В какой-то момент я должен записать данные UTF-8 в файл; чтобы сделать это, я использую CFiles и CStrings.

Когда я добираюсь, чтобы записать utf-8 (российские символы, быть более точным) данные в файл, вывод похож

Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî

и и т.д. Это - assurely не 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

Я пропускаю что-то? Я буду использовать что-то еще вместо этого? Есть ли некоторая выгода, которую я пропустил? Я буду настроен для Вашей мудрости и опыта, коллег - программистов.

Править: Конечно, поскольку я просто задал вопрос, я наконец нахожу что-то, что могло бы быть интересным, который может быть найден здесь. Мысль я мог бы совместно использовать его.

РЕДАКТИРОВАНИЕ 2:

Хорошо, таким образом, я добавил BOM к своему файлу, который теперь содержит китайский символ, вероятно, потому что я не преобразовал свою строку в UTF-8. Для добавления BOM, я сделал...

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. strlen, кажется, не принимает TCHAR. Фиксированный, использовал статическую длину 1 000 вместо этого.

РЕДАКТИРОВАНИЕ 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:

Я удалил ранее добавленный код, как Nate попросил, и я решил использовать его код вместо этого, подразумевая, что теперь, когда я добираюсь для добавления моей строки, я имею...

        CT2CA outputString(sWorkingLine, CP_UTF8);

    //Add line to file.
    CSVFile.Write(outputString,::strlen(outputString));

Все компилирует прекрасный, но российские символы показывают как???????. Получение ближе, но все еще это. Btw, я хотел бы благодарить всех, кто пробовал/пробовал помочь мне, он ОЧЕНЬ ценится. Я застрял на этом некоторое время теперь, я не могу ждать, чтобы эта проблема закончилась.

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ (я надеюсь) Путем изменения способа, которым я сначала получил свои символы UTF-8 (я повторно закодировал, действительно не зная), который был ошибочен с моим новым способом произвести текст, я получил приемлемые результаты. Путем добавления символа BOM UTF-8 в начале моего файла это могло быть считано как Unicode в других программах, как Excel.

Ура! Поблагодарите Вас все!

15
задан 9 revs 23 February 2010 в 20:35
поделиться

3 ответа

CodeIgniter имеет отличный XSS-фильтр, его можно вырвать из файла system/libraries/Input.php, если вы хотите, чтобы он был автономной функцией.

-121--2843380-

Наконец, я нашел и просмотрел список Roxygen-devel по адресу R-forge , чтобы узнать, когда это будет реализовано, и, похоже, он уже находится в версии Roxygen, которая находится на CRAN. Ключ должен указывать use.Rd2 = TRUE при вызове roxygenize () . В этом режиме Roxygen пропустит создание документации для любых функций, которым не предшествуют комментарии Roxygen.

-121--3311359-

При выводе данных (предполагается, что компиляция выполняется в режиме Юникода, что настоятельно рекомендуется):

CString russianText = L"Привет мир";

CFile yourFile(_T("yourfile.txt"), CFile::modeWrite | CFile::modeCreate);

CT2CA outputString(russianText, CP_UTF8);
yourFile.Write(outputString, ::strlen(outputString));

Если _ Юникод не определен (вместо этого вы работаете в многобайтовом режиме), необходимо знать, на какой кодовой странице находится ваш входной текст, и преобразовать его в то, что вы можете использовать. В этом примере показана работа с русским текстом в UTF-16 формате с сохранением в UTF-8:

// Example 1: convert from Russian text in UTF-16 (note the "L"
// in front of the string), into UTF-8.
CW2A russianTextAsUtf8(L"Привет мир", CP_UTF8);
yourFile.Write(russianTextAsUtf8, ::strlen(russianTextAsUtf8));

Вероятнее всего, русский текст находится в другой кодовой странице, например, в KOI-8R. В этом случае необходимо преобразовать другую кодовую страницу в UTF-16. Затем преобразуйте UTF-16 в UTF-8. Преобразование непосредственно из KOI-8R в UTF-8 с помощью макросов преобразования невозможно, поскольку они всегда пытаются преобразовать узкий текст в системную кодовую страницу. Таким образом, простой способ:

// Example 2: convert from Russian text in KOI-8R (code page 20866)
// to UTF-16, and then to UTF-8. Conversions between UTFs are
// lossless.
CA2W russianTextAsUtf16("\xf0\xd2\xc9\xd7\xc5\xd4 \xcd\xc9\xd2", 20866);
CW2A russianTextAsUtf8(russianTextAsUtf16, CP_UTF8);
yourFile.Write(russianTextAsUtf8, ::strlen(russianTextAsUtf8));

Вам не нужна спецификация (она необязательна; Я бы не использовал его, если бы не было конкретной причины для этого).

Убедитесь, что вы прочитали : http://msdn.microsoft.com/en-us/library/87zae4a3 (VS.80) .aspx . При неправильном использовании CT2CA (например, при использовании оператора присвоения) возникнут проблемы. На странице связанной документации приведены примеры использования и отказа от использования.

Дополнительная информация:

  • C в CT2CA указывает конст . Я использую его, когда это возможно, но некоторые преобразования поддерживают только версию, отличную от const (например, CW2A ).
  • Значение T в CT2CA указывает на то, что выполняется преобразование из в LPCTSTR . Таким образом, будет работать независимо от того, скомпилирован ли код с флагом _ UNICODE или нет. Можно также использовать CW2A (где W обозначает широкие символы).
  • A в CT2CA означает, что выполняется преобразование в последовательность «ANSI» (8-битный символ).
  • Наконец, второй параметр CT2CA указывает на преобразуемую кодовую страницу.

Для обратного преобразования (из UTF-8 в LPCTSTR) можно выполнить следующее:

CString myString(CA2CT(russianText, CP_UTF8));

В этом случае мы преобразуем из ANSI последовательностей в формате UTF-8 в LPCTSTR. Всегда предполагается, что LPCTSTR UTF-16 (если определен _ UNICODE ) или текущая системная кодовая страница (если не определен _ UNICODE ).

25
ответ дан 1 December 2019 в 02:01
поделиться

Это то, что вы ищете?

setTimeout('JsFunction1(val);', 0); 
setTimeout('JsFunction2(val);', 0);
-121--3594892-

Вам придется преобразовать sWorkingLine в UTF-8, а затем записать его в файл.

WeyCharToMultiByte может преобразовывать строки Юникода в UTF-8, если выбрана кодовая страница CP _ UTF8 . MultiByteToWeyChar может преобразовывать символы ASCII в Юникод.

-121--2387508-

Убедитесь, что используется Юникод (TCHAR wchar_t). Затем перед записью данных преобразуйте их с помощью функции WireCharToMultiByte Win32 API.

0
ответ дан 1 December 2019 в 02:01
поделиться

Вам нужно будет преобразовать sWorkingLine в UTF-8, а затем записать его в файл.

WideCharToMultiByte может преобразовывать строки Unicode в UTF-8, если вы выбираете кодовую страницу CP_UTF8 . MultiByteToWideChar может преобразовывать символы ASCII в Unicode.

6
ответ дан 1 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: