“的NSString stringWithUTF8String:”过于敏感

“的NSString stringWithUTF8String:”过于敏感

问题描述:

我在做使用像NSStringNSData高层可可的功能,而不是向下挖掘至C级之类的东西上的char小号阵列工作的一些字符串操作的中间。“的NSString stringWithUTF8String:”过于敏感

对于它的爱,+[NSString stringWithUTF8String:]有时返回nil上一个完美的字符串,首先用-[NSString UTF8String]创建。人们会认为这是在输入格式错误时发生的。下面是失败时,以十六进制输入的一个示例:

55 6B 66 51 35 59 4A 5C 6A 60 40 33 5F 45 58 60 9D 47 3F 6E 5E 
60 59 34 58 68 41 4B 61 4E 3F 41 46 00 

和ASCII:

UkfQ5YJ\j`@3_EX`G?n^`Y4XhAKaN?AF 

这是随机生成的字符串,来测试我子程序。

char * buffer = [randomNSString UTF8String]; 
// .... doing things .... in the end, buffer is the same as before 
NSString * result = [NSString stringWithUTF8String:buffer]; 
// yields nil 

编辑:万一有人没掌握隐含的问题,在这里它是在-v模式:

为什么[的NSString stringWithUTF8String:]有时返回一个五脏俱全nil UTF8-串?

+0

在'-UTF8String'和'-stringWithUTF8String:'之间是否有任何机会autorelease池被耗尽? – 2011-06-07 09:40:16

+0

@Bavarious:不,缓冲区在'stringWithUTF8String:'被调用的时候仍然活着。 – 2011-06-07 09:49:10

+1

你能发布产生该缓冲区的原始UTF-8字符串吗?可能首先通过'-dataUsingEncoding:'来表示'NSData'表示,然后是'-UTF8String'之后的缓冲区。 – 2011-06-07 09:54:30

这在黑暗中有点刺,因为我们没有足够的信息来正确诊断问题。

如果randomNSString不再在您分配的内存result,举例来说,如果它已经在引用计数的环境中释放或在GC环境中收集的点存在,有可能buffer指向具有记忆被释放但尚未被重用(这可以解释为什么它仍然是一样的)。

但是,创建一个新的NSString需要分配内存,它可能会使用缓冲区指向的块,这意味着您的UTF8字符串会被新的NSString的内部消除。您可以通过在未能创建result之后登录缓冲区的内容来测试此理论。不要使用%s说明符,但打印十六进制字节。

walkytalky是对的。 9d在这种方式在utf8中不合法。 UTF8字节的前10位保留为连续字符,它们不会出现前缀字符不超过一个前导位。