Я в настоящее время работаю над программой 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.
Ура! Поблагодарите Вас все!
CodeIgniter имеет отличный XSS-фильтр, его можно вырвать из файла system/libraries/Input.php, если вы хотите, чтобы он был автономной функцией.
-121--2843380- Наконец, я нашел и просмотрел список Roxygen-devel по адресу R-forge , чтобы узнать, когда это будет реализовано, и, похоже, он уже находится в версии Roxygen, которая находится на CRAN. Ключ должен указывать use.Rd2 = TRUE
при вызове roxygenize ()
. В этом режиме Roxygen пропустит создание документации для любых функций, которым не предшествуют комментарии Roxygen.
При выводе данных (предполагается, что компиляция выполняется в режиме Юникода, что настоятельно рекомендуется):
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
(например, при использовании оператора присвоения) возникнут проблемы. На странице связанной документации приведены примеры использования и отказа от использования.
Дополнительная информация:
CT2CA
указывает конст
. Я использую его, когда это возможно, но некоторые преобразования поддерживают только версию, отличную от const (например, CW2A
). CT2CA
указывает на то, что выполняется преобразование из в LPCTSTR
. Таким образом, будет работать независимо от того, скомпилирован ли код с флагом _ UNICODE
или нет. Можно также использовать CW2A
(где W обозначает широкие символы). CT2CA
означает, что выполняется преобразование в последовательность «ANSI» (8-битный символ). CT2CA
указывает на преобразуемую кодовую страницу. Для обратного преобразования (из UTF-8 в LPCTSTR) можно выполнить следующее:
CString myString(CA2CT(russianText, CP_UTF8));
В этом случае мы преобразуем из ANSI последовательностей в формате UTF-8 в LPCTSTR. Всегда предполагается, что LPCTSTR
UTF-16 (если определен _ UNICODE
) или текущая системная кодовая страница (если не определен _ UNICODE
).
Это то, что вы ищете?
setTimeout('JsFunction1(val);', 0);
setTimeout('JsFunction2(val);', 0);
-121--3594892- Вам придется преобразовать sWorkingLine
в UTF-8, а затем записать его в файл.
WeyCharToMultiByte может преобразовывать строки Юникода в UTF-8, если выбрана кодовая страница CP _ UTF8
.
MultiByteToWeyChar может преобразовывать символы ASCII в Юникод.
Убедитесь, что используется Юникод (TCHAR wchar_t). Затем перед записью данных преобразуйте их с помощью функции WireCharToMultiByte Win32 API.
Вам нужно будет преобразовать sWorkingLine
в UTF-8, а затем записать его в файл.
WideCharToMultiByte может преобразовывать строки Unicode в UTF-8, если вы выбираете кодовую страницу CP_UTF8
.
MultiByteToWideChar может преобразовывать символы ASCII в Unicode.