Objective c &引用;NSString stringWithUTF8String:“;他太敏感了 我是在使用一些高级的COCOA特性(如代码> NString 和 NStase >进行字符串操作的过程,而不是像C代码> char < /COD> S.来处理C级的事情。
出于对它的喜爱,Objective c &引用;NSString stringWithUTF8String:“;他太敏感了 我是在使用一些高级的COCOA特性(如代码> NString 和 NStase >进行字符串操作的过程,而不是像C代码> char < /COD> S.来处理C级的事情。,objective-c,cocoa,utf-8,nsstring,Objective C,Cocoa,Utf 8,Nsstring,出于对它的喜爱,+[nsstringwithutf8string:有时会在一个非常好的字符串上返回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码: UkfQ
+[nsstringwithutf8string:
有时会在一个非常好的字符串上返回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 String WITHUTF8STRING:]有时会在格式完美的UTF8字符串上返回
nil
?这有点像是暗箭伤人,因为我们没有足够的信息来正确诊断问题
如果为结果
分配内存的位置不再存在随机字符串
,例如,如果它已在引用计数环境中释放或在GC环境中收集,则缓冲区
可能指向已释放但尚未重用的内存(这可以解释为什么它仍然是一样的)
但是,创建新的NSString需要分配内存,它可能会使用缓冲区指向的块,这意味着您的UTF8字符串将被新NSString的内部攻击。您可以在创建
结果失败后通过记录缓冲区的内容来测试这一理论。不要使用%s
说明符though,打印十六进制字节。walkytalky是正确的。9d在utf8中以这种方式是不合法的。带有顶部位10的utf8字节被保留为连续字符,它们在没有前缀字符的情况下永远不会出现,并且有多个前导位。在-UTF8String
和-stringWi之间是否有可能耗尽自动释放池thUTF8String:
?@BaVariable:Nope,缓冲区在调用stringWithUTF8String:
时仍处于活动状态并正在启动中。您可以发布生成该缓冲区的原始UTF-8字符串吗?可以先通过-DataUsingEncode:
表示一个NSData
,然后是-UTF8String
后的缓冲区。给定的ASCII和十六进制表示之间存在不匹配——ASCII中不存在9D。查看UTF8规范,此缓冲区不是有效的UTF8,因此NSString失败是正确的。因此,我想问题是为什么它不正确?如果您去掉中间人,只需执行result=[NSString stringWithUTF8String:[randomNSString UTF8String]
您得到的结果有效吗?