Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c &引用;NSString stringWithUTF8String:“;他太敏感了 我是在使用一些高级的COCOA特性(如代码> NString 和 NStase >进行字符串操作的过程,而不是像C代码> char < /COD> S.来处理C级的事情。_Objective C_Cocoa_Utf 8_Nsstring - Fatal编程技术网

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]
您得到的结果有效吗?