2015-12-02 5 views
-1
std::wstring arabic=L"الحانة"; 
std::wstring english=L"english language"; 
logger->log(NORMAL,L"abcdefgh"); 
logger->log(NORMAL,&arabic[0]); 
logger->log(NORMAL,&english[0]); 

Я получаю «abcdefgh, ?????, английский язык» в своем файле журнала. Но я ожидаю, что арабские персонажи будут напечатаны. Я использую визуальную студию 2005. Помогите пожалуйста.арабские символы в wstring не печатаются

+0

Никто не знает, что делает этот регистратор. – AlexanderVX

+0

Вы должны показать код, в котором регистратор - независимо от того, что может быть - записывает в файл. Может быть, вы пишете файл с кодировкой ANSI? – Blacktempel

+0

Формально не гарантируется, что буфера строк заканчивается нулем. На практике я думаю, что это в значительной степени подразумевается гарантией C++ 11, также для строки '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' устраняя это сомнение, передать 'wstring' в регистратор, а не только указатель на его начало. –

ответ

2

Вам нужно сделать две вещи.

  1. Убедитесь, что исходный файл UTF-8 с BOM.
  2. Позвоните либо _setmode(filedescriptor, _O_U16TEXT);, либо _setmode(filedescriptor, _O_U8TEXT); перед выполнением каких-либо выходов.

Выбор режима зависит от того, хотите ли вы выход UTF-8 или UTF-16. Большую часть времени вы хотите UTF-8, если вы пишете файл на диске, и UTF-16, если вы пишете на консоль. Почему, не эта система прекрасная?

Чтобы получить файловый дескриптор для wfstream yourstream, используйте yourstream.fd(). Чтобы получить файловый дескриптор для stdout, используйте _fileno(stdout).

Консоль может поддерживать или не поддерживать арабский язык. См. here для получения дополнительной информации. Однако вы всегда должны писать в файл.

Вы должны включать в себя дополнительные заголовки:

#include <io.h> 
#include <fcntl.h> 

Примечание, это специфично для компилятора Microsoft.

Редактировать: добавлено обсуждение различных режимов.

+0

Вместо того, чтобы прибегать к '_setmode()', вы можете вместо 'imbue()' UTF-8 'locale' на' wfstream'. –

+0

@RemyLebeau Пожалуйста, покажите, как это делается. –

+0

Существует множество онлайн-примеров/обучающих программ, в которых показано, как использовать метод ['imbue()') (http://en.cppreference.com/w/cpp/io/basic_ios/imbue). –

0

Здесь могут быть разные проблемы.

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

Как вы можете видеть ???... в файле, я предполагаю, что это не текущая проблема - если logger.log не использует operator <<

Но может быть еще одна проблема: даже если файл был правильно написан, файл редактор, используемый для отображения, может иметь проблемы с символами без ASCII. Чтобы убедиться в этом, вы должны изучить дамп файла ascii. Если символы, отображаемые как ?, имеют код ASCII 0x3f, проблема была действительно в момент записи. Но если они имеют коды ASCII, превышающие 127, то это просто проблема с отображением.

vim - это многоплатформенный редактор, который позволяет преобразовать файл в гекса, чтобы увидеть дамп ASCII.

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