Как я могу напечатать Unicode CString (на японском языке) в текстовый файл?
Это кажется трудным для меня. У меня есть этот код, который распечатывает CString в текстовый файл, но значение в Unicode (японский). Как только эта строка будет нажата, ничего не будет напечатано.
Любая идея, как я могу напечатать японский текст в текстовом файле?
#define OFSTREAM std::wofstream
OFSTREAM *outfile;
outfile = new OFSTREAM;
outfile->open (filename, ios::out);
CString varName = _T(" ");
/*stuff*/
*outfile << _T(" Name: ") << (LPCTSTR)varName << _T("\n");
3 ответа
Причина, по которой поток перестает работать, заключается в том, что бит сбоя установлен. Вы не обрабатываете ошибку, поэтому поток перестает работать. Бит сбоя должен быть очищен при возникновении ошибок.
Языковой стандарт объекта wostream должен быть установлен таким образом, чтобы фасет codecvt обрабатывал преобразование широких символов японского языка в байты. По умолчанию используется локаль "C", которая в VS будет поддерживать только символы ASCII. Если вам нужно только написать файл для работы на японских версиях Windows, вы можете сделать:
std::wofstream outfile(filename, ios::out);
outfile.imbue(std::locale("")); // use the system locale
CString varName = _T(" ");
/*stuff*/
outfile << L" Name: " << (LPCTSTR)varName << L"\n";
Или вы можете указать японский язык на Windows:
outfile.imbue(std::locale("Japanese")); // use the japanese locale on any Windows system
Оба эти метода используют устаревшую японскую кодировку локали, чего, вероятно, следует избегать. Вместо этого вы можете использовать UTF-8:
// replace just the codecvt facet of the stream's current locale
outfile.imbue(std::locale(outfile.getloc(), new std::codecvt_utf8_utf16<wchar_t>()));
Под Unicode вы, вероятно, имеете в виду UTF16 в этом случае. В зависимости от редактора, который вы используете для просмотра файла, вам может понадобиться поставить метку порядка байтов (BOM) в начале файла, чтобы правильно определить кодировку и порядок байтов. В противном случае вам необходимо явно указать кодировку при просмотре файла.
Тем не менее, ваш вопрос предполагает, что у вас есть текст перед японским текстом в файле. если вы поставите это как неширокую строку, это проблема. Не смешивай Если весь текст широкий, у вас может просто не быть возможности отображать японские символы в выбранном вами редакторе, или вы не установили поддержку азиатских языков в Windows.
Firefox обычно очень хорошо поддерживает экзотических персонажей. перетащите туда файл, проверьте кодировку и посмотрите, что вы получите.
Если вы используете Visual Studio, перейдите к настройкам проекта C++ и установите для языка вариант Unicode вместо ANSI. Тогда Visual Studio автоматически определит макросы UNICODE и _UNICODE, и вы не должны определять их самостоятельно. Вы, вероятно, захотите вызвать setlocale, чтобы библиотека VC++ преобразовывала строки Юникода в памяти в многобайтовые строки ANSI в текстовых файлах, вместо того, чтобы терять все после первого не-ASCII символа.
Если вы используете какой-то другой компилятор с MFC, то, я думаю, вам нужно определить макросы UNICODE и _UNICODE самостоятельно, и я не уверен, что вам еще нужно делать.
Если вы хотите, чтобы ваши текстовые файлы содержали Unicode вместо многобайтовой ANSI, то вы не хотите, чтобы библиотека VC++ преобразовывала их, но вместо этого вам придется делать что-то еще. Взгляните на раздел "Содержимое сообщества" на странице MSDN.