CFStringCreateWithFormat 期望什么样的字符串作为参数?
题
下面的示例应该适用于 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
使用CFStringCreateWithCString
和kCFStringEncodingUTF8
作为编码。
请,请不要使用 %s
在 CFStringCreateWithFormat
. 。请不要依赖“系统编码”,在西欧环境中是MacRoman,但在其他语言中不是。系统编码的概念本质上是脑死亡的,尤其是在东亚环境(我来自那里),甚至ASCII代码范围内的字符(低于127!)都会被修改。如果你依赖“系统编码”,地狱就会崩溃。幸运的是,从 10.4 开始,所有使用“系统编码”的方法现在都已弃用, 除了 %s
... .
对不起,我为这个小主题写了很多东西,但是几年前,这是一个真正的遗憾,当时有许多不错的应用程序,这些应用程序仅仅是因为这种“系统编码”,因此对日语/韩国Mac不起作用。请参阅 这个详细的解释 这是我几年前写的,如果你感兴趣的话。
不隶属于 StackOverflow