从NSString转换为字节然后再返回NSString时出现奇怪的字符

时间:2011-11-05 17:32:14

标签: objective-c cocoa character-encoding nsstring

NSString *message = @"testing";    
NSUInteger dataLength = [message lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
void *byteData = malloc( dataLength );
NSRange range = NSMakeRange(0, [message length]);
NSUInteger actualLength = 0;
NSRange remain;
BOOL result =   [message getBytes:byteData maxLength:dataLength usedLength:&actualLength encoding:NSUnicodeStringEncoding options:0 range:range remainingRange:&remain];
NSString *decodedString = [[NSString alloc] initWithBytes:byteData length:actualLength encoding:NSUnicodeStringEncoding];

我的问题是我希望decodeString可以测试,但它看起来像中文字符。我认为这可能是一个空终止数据的问题,但似乎这应该不是问题。

2 个答案:

答案 0 :(得分:3)

你想要这样的东西吗?

    NSString *message = @"testing";    
    NSData *bytes = [message dataUsingEncoding:NSUTF8StringEncoding];
    NSString* messageDecoded = [[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding];
    NSLog(@"decoded: %@", messageDecoded);

答案 1 :(得分:2)

UTF-16字节顺序在编码和解码之间反转。

您可以执行以下任一操作:

  • 使用指定显式字节顺序的编码(例如NSUTF16BigEndianStringEncodingNSUTF16LittleEndianStringEncodingNSUTF8StringEncoding)。

  • NSStringEncodingConversionExternalRepresentation传递给options:中的getBytes:maxLength:usedLength:encoding:options:range:参数。这会将字节顺序标记添加到数据的开头。

  • 使用NSData,如Elvis建议的那样。

目前,在大多数情况下,UTF-8是首选的Unicode编码。