下面的示例应该与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.
答案 0 :(得分:4)
如果您想通过%@
加入CFStringRef
,请使用CFStringCreateWithFormat
。
请参阅the Format Specifiers section of Strings Programming Guide for Core Foundation。
%@
适用于Objective C对象,或CFTypeRef
个对象(CFStringRef
与CFTypeRef
兼容)%s
用于8位无符号字符的空终止数组(即普通C字符串)。%S
用于以16位Unicode字符的空终止数组。CFStringRef对象与“以16位Unicode字符的空终止数组”不同。
答案 1 :(得分:2)
作为对其他答案中评论的回答,我建议海报
char*
CFString
将CFStringCreateWithCString
转换为kCFStringEncodingUTF8
作为编码。请不要在%s
中使用CFStringCreateWithFormat
。请不要依赖“系统编码”,即西欧环境中的MacRoman,而不是其他语言。系统编码的概念本质上是脑死亡的,特别是在东亚环境(我来自),甚至修改了ASCII码范围内的字符(低于127!)。如果依靠“系统编码”,地狱就会松动。幸运的是,自10.4以来,所有使用“系统编码”的方法现已弃用,除了 %s
....
对不起,我为这个小话题撰写了这么多内容,但几年前有很多不错的应用程序因为这种“系统编码”而无法在日语/韩语Mac上运行,这真的很可惜。 “如果您有兴趣,请参阅几年前我写的this detailed explanation。