wstring中的阿拉伯字符未被打印

时间:2015-12-02 06:57:48

标签: c++ visual-c++ unicode encoding

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.请帮助。

2 个答案:

答案 0 :(得分:2)

你需要做两件事。

  1. 确保您的源文件带BOM的UTF-8
  2. 在进行任何输出之前,请先致电_setmode(filedescriptor, _O_U16TEXT);_setmode(filedescriptor, _O_U8TEXT);
  3. 模式的选择取决于您是想要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转储。