【问题标题】:CoreFoundation printing Unicode charactersCoreFoundation 打印 Unicode 字符
【发布时间】:2013-09-06 22:58:06
【问题描述】:

我有当前的代码,除了 CFShow 没有将 \u00e9 的 unicode UTF8 编码转换为 é 之外,它似乎确实可以工作

#include <CoreFoundation/CoreFoundation.h>

int main()
{

    char *s = "This is a test of unicode support: fiancée\n";
    CFTypeRef cfs = CFStringCreateWithCString(NULL, s, kCFStringEncodingUTF8);
    CFShow(cfs);

}

输出是

This is a test of unicode support: fianc\u00e9e
                                        |____|
                                           > é doesn't output properly.

我如何指示 CFShow 它是 unicode?当它是一个 c 字符串时,printf 可以很好地处理它。

【问题讨论】:

  • 如果 CFShow 还不相信字符串是 Unicode,它就不会像这样解释字符并使用 \u 转义。你会看到像\xC3\xA9 这样的东西。

标签: c++ c macos core-foundation


【解决方案1】:

CFShow() 仅用于调试。为了避免歧义,它故意将非 ASCII 码转换为转义码。例如,“é”可以用两种方式表示:U+00E9 带有 ACUTE 的拉丁小写字母 E 或 U+0065 拉丁小写字母 E 后跟 U+0301 COMBINING ACUTE ACCENT。如果 CFShow() 发出 UTF-8 序列,您的终端可能会将其显示为“é”,您将无法分辨字符串中的变体。这会破坏CFShow() 用于调试的有用性。

你为什么关心CFShow()的输出,只要你了解字符串的内容是什么?

【讨论】:

  • 将其用作控制台的输出,而无需求助于 C 库和使用 printf。因此,这是一种使用 Mac OS X API Core Foundation 将 Win API 函数输出到控制台的方法。
  • @Zimm3r:这不是CFShow 的用途。 CFShow 用于查看字符串的内容以进行调试,而不是用于常规输出。您应该问一个关于将 CFString 写入标准输出或标准错误的正确方法的单独问题。把链接发给我,我会回复的。
  • CFShow() 不适合字符串(或其他任何东西)的一般打印。正如我所说,这是一个调试功能。如果确定要避开 C 库和 stdio,可以使用CFStringCreateExternalRepresentation() 或CFStringGetCString() 获取UTF-8 编码的字节缓冲区,并使用write() 等输出。
【解决方案2】:

在我看来,CFShow 知道字符串是 Unicode,但不知道如何为控制台格式化 Unicode。我怀疑除了寻找替代方案之外你可以做任何事情,也许是NSLog。

【讨论】:

  • NSLog 是客观的 c,不是吗?我正在尝试坚持使用 C 和 C++,以便可以轻松地在汇编中使用它(Apple 似乎回避的东西)。
  • 是的,NSLog 是 Objective-C。但是你可以编写一个包装函数,接受一个 CFStringRef 并将其传递给NSLog,从而将 Objective-C 限制在一个小文件中。
  • 我试图避免客观 c,这似乎是不可能的感觉,苹果如此悲伤地使用它。哦,现在试图找到如何在程序集中调用它;看起来很多 og objc_msgSend 调用。
  • 现在我看了一下,声明是extern "C" void NSLog(NSString *format, ...)。因此,如果您知道如何在汇编中使用可变数量的参数调用 C 函数,那么您应该已经准备好了。
  • @Zimm3r:NSLog是Foundation框架提供的一个C函数。仅仅因为大部分框架是Objective-C类并不意味着它什么都不是。居然有rather a lot of Foundation functions。
猜你喜欢
  • 2018-06-22
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2014-08-01
相关资源
最近更新 更多