【问题标题】:Conversion from NSData to NSString is Truncating Where Multi-Byte UTF8 Characters Are Used从 NSData 到 NSString 的转换在使用多字节 UTF8 字符的地方被截断
【发布时间】:2012-08-01 06:12:26
【问题描述】:

在下面的代码中,我丢失了字符串中的最后一个字符。

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 对象中。

我在这里做错了什么?

【问题讨论】:

    标签: unicode nsstring nsdata


    【解决方案1】:

    这里是解决方案。这可能对其他人有所帮助,因此我将其保留在这里,而不是删除问题。

    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 字符串“就像释放返回的对象一样”进行处理,这意味着它是自动释放的。 (请参阅类参考以了解确切的措辞。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多