2015-09-12 2 views
1

Я написал этот код, используя VS 2012:C++ std :: wofstream unicode проблема.

std::wofstream logout("my_log.txt", std::ios_base::out | std::ios_base::trunc); 
std::locale utf8_locale(locale(), new codecvt_utf8<wchar_t>); 
logout.imbue(utf8_locale); 

if (!logout.is_open()) 
{ 
printf("Cannot open file.\n"); 
return 1; 
} 
else printf("Log file created.\n"); 

logout << "Client IP   │"<< "Recv time    │"<< "Request    │"<< "Response  "<<endl; 
logout << "─────────────────────┼"<< "─────────────────────────┼"<<endl; 

В my_log.txt файле все символы Юникода заменяются «?????». Я хочу создать что-то вроде таблицы файлов журналов. Если я использую стандартные символы ASCII, такие как «---», он будет работать, и все они будут показаны правильно. Ive попытался изменить глобальную локаль, но мне это не удалось.

+1

Вы уверены, что редактор, который используете для просмотра файла, поддерживает UTF8/в режиме Unicode? – Mat

+0

Хм, на самом деле я не уверен. Я попытался открыть этот файл, используя MS Word и блокнот, но проблема остается. –

+2

Продукт MS не поддерживает UTF8. Все MS/Windows - UTF16. Попробуйте шестнадцатеричный просмотрщик, чтобы узнать, что действительно в вашем файле. –

ответ

0

Вот почему мы не используем ничего, кроме ASCII в строковых литералах.

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

Вместо этого используйте escape-последовательности (\uXXXX), чтобы вы знали, что получаете. В 2015 году вы не можете ошибиться с исходным кодом, сформированным из символов ASCII.

0

О, это на самом деле так смешно.

wchar_t *s1 = L"\u2502"; // "│" 
wchar_t *s2 = L"\u2500"; // "─" 
wchar_t *s3 = L"\u253C"; // "┼" 
logout << s1<<s2<<s3<<endl; 

В мой .txt файл теперь я вижу номера юникода. Но я могу использовать тот же-структуру без (\uXXXX)

logout << L" │ ─ ┼"<<endl; 

Это работает как хорошо.

+0

Предложение: 'wchar_t const s1 = L '\ u2502';'. –

+0

Ну, эти не-ASCII-литералы почти наверняка не будут работать с GCC. Он не переносится. –

+0

@UlrichEckhardt О, да, вы правы. –

Смежные вопросы