在下面的代码中,我丢失了字符串中的最后一个字符。
NSString *testString = @"— choose a category —";
NSData *testData = [NSData dataWithBytes:[testString UTF8String] length:[testString length]];
NSString *newString = [[[NSString alloc] initWithData:testData encoding:NSUTF8StringEncoding] autorelease];
调试器显示:
(lldb) po testString
(NSString *) $7 = 0x002ec7f0 — choose a category —
(lldb) po testData
(NSData *) $8 = 0x1003d1c0 <e2809420 63686f6f 73652061 20636174 65676f72 79>
(lldb) po newString
(NSString *) $9 = 0x09109f50 — choose a category
(lldb)
字节对应于如下字符:
e2 80 94 | 20 | 63 | 68 | 6f | 6f | 73 | 65 | 20 | 61 | 20 | 63 | 61 | 74 | 65 | 67 | 6f | 72 | 79 |
EM DASH | sp | c | h | o | o | s | e | sp | a | sp | c | a | t | e | g | o | r | y | sp | EM DASH
我看到上传到我的服务器的字符串更长的问题,并且似乎总是使用多字节UTF8字符。
当我从服务器下载记录的数据时,unicode字符(尚未截断)正确显示。但是我的服务器上记录的字符串被截断,表明截断存在于NSData对象中。
我在这里做错了什么?
答案 0 :(得分:0)
这是解决方案。这可能会帮助其他人,所以我会把它留在这里,而不是删除这个问题。
NSData dataWithBytes:length:需要生成的字节数组的长度值。这是在NSString转换为以null结尾的UTF8表示后确定的。
因此,以这种方式正确处理到NSData的转换:
NSData *testData = [NSData dataWithBytes:[testString UTF8String] length:strlen([testString UTF8String])];
为避免将testString转换两次,可以这样做:
const char *testStringUTF8 = [testString UTF8String];
NSData *testData = [NSData dataWithBytes:testStringUTF8 length:strlen(testStringUTF8)];
NSString类引用声明UTF8String方法返回的C字符串被处理&#34;正如返回的对象被释放&#34;,这意味着它是自动释放的。 (有关准确措辞,请参阅课程参考。)