【发布时间】:2011-06-07 09:34:50
【问题描述】:
我正在使用高级 Cocoa 功能(例如 NSString 和 NSData)进行一些字符串操作,而不是深入到 C 级别的事情(例如处理 chars 的数组)。
出于对它的喜爱,+[NSString stringWithUTF8String:]sometimes 返回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:] 有时会在完美格式的 UTF8-String 上返回 nil?
【问题讨论】:
-
在
-UTF8String和-stringWithUTF8String:之间自动释放池是否有可能耗尽? -
@Bavarious:不,
buffer在调用stringWithUTF8String:时仍然活着并且还在踢。 -
您能发布产生该缓冲区的原始 UTF-8 字符串吗?可能首先通过
-dataUsingEncoding:表示NSData,然后是-UTF8String之后的缓冲区。 -
给定的 ASCII 和十六进制表示之间不匹配 - ASCII 中不存在 9D。
-
查看 UTF8 规范,这个缓冲区是 not 有效的 UTF8,所以 NSString 失败是正确的。所以我想问题是 为什么 不对?如果你去掉中间人,直接去
result=[NSString stringWithUTF8String:[randomNSString UTF8String]],你会得到一个有效的结果吗?
标签: objective-c cocoa utf-8 nsstring