字符串中的阿拉伯字符未打印

arabic characters in wstring not getting printed

本文关键字:打印 字符 阿拉伯 字符串      更新时间:2023-10-16
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。请帮忙。

你需要做两件事。

  1. 确保您的源文件是带有 BOM 的 UTF-8
  2. 在执行任何输出之前调用 _setmode(filedescriptor, _O_U16TEXT);_setmode(filedescriptor, _O_U8TEXT);

模式的选择取决于您是需要 UTF-8 还是 UTF-16 输出。大多数情况下,如果要写入磁盘文件,则需要 UTF-8,如果要写入控制台,则需要 UTF-16。为什么,这个系统不是很漂亮吗?

要获取 wfstream yourstream 的文件描述符,请使用 yourstream.fd() 。要获取 stdout 的文件描述符,请使用 _fileno(stdout)

控制台可能支持也可能不支持阿拉伯语。有关更多信息,请参阅此处。不过,您应该始终能够写入文件。

您需要包含其他标头:

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

请注意,这是特定于Microsoft编译器的。

编辑:增加了对不同模式的讨论。

这里可能有不同的问题。

在 ansi 模式下写入文件时,库会尝试将 unicode 字符串转换为缩小字符。如果不可能,则会导致错误,并且在清除错误条件之前不会再写入流。

正如您在文件中看到???...的那样,我认为这不是您当前的问题 - 除非logger.log不使用operator <<

但可能还有另一个问题:即使文件写入正确,用于显示该文件的文件编辑器也可能出现非 ASCII 字符的问题。为了确保这一点,您应该检查文件的 ascii 转储。如果显示为?字符的 ASCII 代码为 0x3f则问题确实出在写入时。但是,如果它们的ASCII码大于127,那么这只是一个显示问题。

vim 是一个多平台编辑器,允许将文件转换为 Hexa 以查看 ASCII 转储。