【问题标题】:How to make printf to print a character buffer the same way as NSLog does?如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
【发布时间】: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


【解决方案1】:

NSLog 输出不是“按原样”转储到“控制台”(在这种情况下为标准错误)的输出 - 它正在为两个字节 377 376 写入四个字节 313 207 313 233

printf 正在将字节 377 376 输出到“控制台”(本例中为标准输出)。

如果您将代码编译为命令行应用程序,然后在终端管道中通过od -bc 输出输出,您将看到这一点。

所以是 Xcode 的漂亮打印产生了\377\376

如果您想要“原样”字节,您可以使用fprintf 写入文件,或者如果您无法更改代码,您可以使用dup(2) 等来捕获发送到标准输出的输出。

或者,您可以预处理字符串以用单个字符替换不可打印的内容。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多