下面的示例应该适用于 Unicode 字符串,但事实并非如此。


CFStringRef aString =  CFSTR("one"); // in real life this is an Unicode string
CFStringRef formatString = CFSTR("This is %s example"); // also tried %S but without success
CFStringRef resultString = CFStringCreateWithFormat(NULL, NULL, formatString, aString);

// Here I should have a valid sentence in resultString but the current result is like aString would contain garbage.
有帮助吗?

解决方案

使用 %@ 如果你想包括一个 CFStringRef 通过 CFStringCreateWithFormat.

Core Foundation 字符串编程指南的格式说明符部分.

  • %@ 适用于 Objective C 对象,或者 CFTypeRef 对象(CFStringRef 兼容于 CFTypeRef)
  • %s 用于 8 位无符号字符的以 null 结尾的数组(即普通 C 字符串)。
  • %S 用于以 null 结尾的 16 位 Unicode 字符数组。

CFStringRef 对象与“以 null 结尾的 16 位 Unicode 字符数组”不同。

其他提示

作为对其他答案中评论的回答,我会推荐海报给

  • 以可移植的方式生成 UTF8 字符串 char*
  • 并在最后一刻将其转换为 CFString 使用 CFStringCreateWithCStringkCFStringEncodingUTF8 作为编码。

请,请不要使用 %sCFStringCreateWithFormat. 。请不要依赖“系统编码”,在西欧环境中是MacRoman,但在其他语言中不是。系统编码的概念本质上是脑死亡的,尤其是在东亚环境(我来自那里),甚至ASCII代码范围内的字符(低于127!)都会被修改。如果你依赖“系统编码”,地狱就会崩溃。幸运的是,从 10.4 开始,所有使用“系统编码”的方法现在都已弃用, 除了 %s... .

对不起,我为这个小主题写了很多东西,但是几年前,这是一个真正的遗憾,当时有许多不错的应用程序,这些应用程序仅仅是因为这种“系统编码”,因此对日语/韩国Mac不起作用。请参阅 这个详细的解释 这是我几年前写的,如果你感兴趣的话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top