Как я могу распечатать CString Unicode (на японском языке) в текстовый файл?

Это кажется мне тяжелым. У меня есть этот код, который выводит 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");

person SoftwareGuy    schedule 31.08.2012    source источник
comment
Вы строите с макросом UNICODE? То есть LPCTSTR совпадает с LPCWSTR?   -  person ildjarn    schedule 31.08.2012
comment
Знает ли ваш юникод CString? CString varName(_T("Unicode aware"));   -  person Jesse Good    schedule 31.08.2012
comment
@ildjarn: Спасибо за предложение. Я не был, но я добавил «#define UNICODE» в начало файла и заменил «LPCTSTR» на «LPCWSTR», и пока это не имело никакого значения.   -  person SoftwareGuy    schedule 31.08.2012
comment
UNICODE не является кодировкой. Это в UTF8 или UTF16 или в кодовой странице или как?   -  person Mooing Duck    schedule 31.08.2012
comment
@JesseGood: Извините, я не уверен, что это значит. У меня это объявлено так: CString varName = _T(" ");   -  person SoftwareGuy    schedule 31.08.2012
comment
А outfile - это указатель на std::wostream? Насколько мы видим, ваш код на 100% в порядке. Нам нужно больше кода, чтобы найти проблему.   -  person Mooing Duck    schedule 31.08.2012
comment
@Mooing Duck: я не уверен, но я вижу это в некоторых файлах resx: <?xml version="1.0" encoding="utf-8"?>   -  person SoftwareGuy    schedule 31.08.2012
comment
А вот объявление для outfile: OFSTREAM *outBasfile; #define OFSTREAM std::wofstream   -  person SoftwareGuy    schedule 31.08.2012
comment
@SoftwareGuy: все еще выглядит на 100% нормально. Проблема в другом.   -  person Mooing Duck    schedule 31.08.2012
comment
Я понимаю. Я понятия не имею, где искать дальше. Я ищу все решение для outFile и нахожу это: outfile = new OFSTREAM; и outfile->open (filename,ios::out); -- я добавлю их к исходному сообщению, как вы сделали мое.   -  person SoftwareGuy    schedule 31.08.2012
comment
Боже мой, #define HORRIBLE_MACRO! Мой #define EYES!   -  person Puppy    schedule 31.08.2012


Ответы (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>()));
person bames53    schedule 31.08.2012
comment
Большое спасибо. Это тот, который я в итоге использовал. - person SoftwareGuy; 26.09.2012
comment
Не вызовет ли new std::codecvt_utf8_utf16<wchar_t>() утечку памяти? - person Zotyi; 19.02.2018

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

Однако ваш вопрос предполагает, что у вас есть текст перед японским текстом в файле. если вы поместите это как неширокую строку, это проблема. Не смешивайте. Если весь текст широкий, возможно, у вас просто нет возможности отображать японские символы в выбранном вами редакторе или вы не установили поддержку азиатских языков в Windows.

Firefox обычно довольно хорошо поддерживает экзотические символы. перетащите файл туда, проверьте кодировку и посмотрите, что у вас получится.

person Daniel S    schedule 31.08.2012

Если вы используете Visual Studio, перейдите к параметрам проекта C++ и установите параметр языка для использования Unicode вместо ANSI. Тогда Visual Studio автоматически определит макросы UNICODE и _UNICODE, и вам не придется определять их самостоятельно. Вы, вероятно, захотите вызвать setlocale, чтобы библиотека VC++ преобразовывала строки Unicode в памяти в многобайтовые строки ANSI в текстовых файлах, а не теряла все после первого символа, отличного от ASCII.

Если вы используете какой-либо другой компилятор с MFC, то, я думаю, вам нужно определить оба макроса UNICODE и _UNICODE самостоятельно, и я не уверен, что еще вам нужно сделать.

Если вы хотите, чтобы ваши текстовые файлы содержали Unicode вместо многобайтового ANSI, вы не хотите, чтобы библиотека VC++ преобразовывала их, но вместо этого вам придется сделать что-то еще. Взгляните на раздел «Содержимое сообщества» на странице MSDN wofstream< /а>.

person Windows programmer    schedule 31.08.2012