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,?????,英语"在我的日志文件中。但是我期待打印阿拉伯字符。我正在使用visual studio 2005.请帮助。
答案 0 :(得分: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编译器特有的。
编辑:添加了对不同模式的讨论。
答案 1 :(得分:0)
这里可能存在不同的问题。
在ansi模式下编写文件时,库会尝试将unicode字符串转换为缩小字符。如果不可能,则会导致错误,除非您清除错误条件,否则不会向流写入任何内容。
正如您在文件中看到的???...
,我认为这不是您当前的问题 - 除非logger.log
不使用operator <<
但是可能还有另一个问题:即使文件写得正确,用于显示文件的文件编辑器也可能存在非ASCII字符问题。为了确保它,您应该检查文件的ascii转储。如果显示为?
的字符的ASCII代码为0x3f
,则问题确实在写入时。但如果他们的ASCII码大于127,那么这只是一个显示问题。
vim是一个多平台编辑器,允许转换为hexa的文件以查看ASCII转储。