字符串中的阿拉伯字符未打印
arabic characters in wstring not getting printed
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。请帮忙。
你需要做两件事。
- 确保您的源文件是带有 BOM 的 UTF-8。
- 在执行任何输出之前调用
_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 转储。
相关文章:
- 打印字符数组地址的正确方法
- c ++控制台应用程序,如何在控制台外部打印字符
- 无法使用 swprintf 在 WCHAR* 中打印字符*
- 存储和打印字符,但输出不是预期的
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- C++无法打印字符变量
- 无法打印字符向量C++向量
- 为什么在编辑 fastq 文件并将输出写入新的 fastq 文件时引入不可打印字符?
- C :如何询问文件名并打印字符数组
- 循环中的 Cout 不会按定义的字符逐个打印字符
- (C++) 打印字符数组字符串的单词时出现问题
- 用putchar在屏幕上打印字符
- 在C 中使用继续语句的打印字符
- 在 for 循环 c++ 中打印字符
- 使用while和if递归打印字符
- 打印字符数组 c++
- 如何使用Xcode中的Unicode打印字符╔(和其他字符)
- cout.put() 是否推荐使用 cout<< 打印字符
- C++ 中的密码 |打印字符后删除字符