【发布时间】:2017-08-04 09:06:59
【问题描述】:
我正在使用带有printf() 函数的跨平台库将数据字节转储到控制台。我注意到由于某种原因,字节被翻译成它们的解码变体,而不是“按原样”转储它们。但是当我使用NSLog 函数时,输出是正确的。
这是我的单元测试中的简化代码示例:
unsigned char *buff = new unsigned char[3]{ 0xff, 0xfe, 0x00};
NSLog(@"\n\n---%s---\n\n", buff);
printf("\n\n---%s---\n\n", buff);
它产生以下输出:
2017-08-03 12:08:53.879 xctest[4725:44271]
---ˇ˛---
---\377\376---
如您所见,NSLog “正确”地处理了字节 0xff, 0xfe,并且只写了两个符号 ˇ˛,但 printf 却写了 \377\376。
在这种情况下如何让 printf 打印ˇ˛(或任何其他两个符号)?
我不关心 Unicode 的正确性;在这种情况下,我只需要 printf 打印两个符号,而不是 \x\y 字符串。
顺便说一句,当我在 Windows 上运行相同的 printf 代码时,它只输出两个字符而不是 \x\y,所以这个问题可能是 *nix 特有的。
【问题讨论】:
-
也许
printf不知道超出基本 7 位 ASCII 的任何扩展字符?也许您需要正确设置语言环境(搜索setlocale)? -
我也是这么想的,我只是用“”、“C”、“en_US”、“en_US.UTF-8”尝试了
setLocale(LC_ALL,但对printf没有影响。不确定,如果有的话,哪种语言环境会有所帮助。 -
我发现在 Windows 上还有
SetConsoleOutputCP会影响输出格式,但我找不到 *nix 的等价物。 -
我认为问题不在于 Unix,而在于 macOS(考虑到您使用 Objective-C 和
NSLog,我认为这是目标)。
标签: c++ objective-c formatting