“NSString stringWithUTF8String:”过于敏感

时间:2011-06-07 09:34:51

标签: objective-c cocoa utf-8 nsstring

我正在使用高级Cocoa功能(如NSStringNSData进行一些字符串操作,而不是像C类数据一样处理C级事务。 {1}}秒。

为了热爱它,char有时会在+[NSString stringWithUTF8String:]创建的完美字符串上返回nil。可以假设当输入格式错误时会发生这种情况。以下是十六进制输入失败的示例:

-[NSString UTF8String]

和ASCII:

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

这是一个随机生成的字符串,用于测试我的子例程。

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

编辑:以防万一有人没有理解隐含的问题,这里是-v模式:

为什么[NSString stringWithUTF8String:]有时会在完美形成的UTF8-String上返回char * buffer = [randomNSString UTF8String]; // .... doing things .... in the end, buffer is the same as before NSString * result = [NSString stringWithUTF8String:buffer]; // yields nil

2 个答案:

答案 0 :(得分:2)

walkytalky是对的。以这种方式,9d在utf8中是不合法的。具有顶部位10的utf8字节被保留为连续字符,它们从不出现没有带有多个前导位的前缀字符。

答案 1 :(得分:0)

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

如果randomNSString在为result分配内存时不再存在,例如,如果它已在引用计数环境中释放或在GC环境中收集,则可能buffer指向已被释放但尚未重用的内存(这可以解释为什么它仍然是相同的)。

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