【问题标题】:Getting weird characters when going from NSString to bytes and then back to NSString从 NSString 到字节然后返回 NSString 时得到奇怪的字符
【发布时间】:2011-11-05 17:32:14
【问题描述】:
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];

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

【问题讨论】:

    标签: objective-c cocoa character-encoding nsstring


    【解决方案1】:

    你想要这样的东西吗?

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

    【讨论】:

    • 我认为您的 initWithBytes 调用中可能缺少长度。实际上我以前有过,但我想如果我可以避免使用 NSData,我愿意。
    • 为什么要避免使用 NSData?
    【解决方案2】:

    UTF-16 字节顺序在编码和解码之间颠倒。

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

    • 使用指定明确字节顺序的编码(例如,NSUTF16BigEndianStringEncodingNSUTF16LittleEndianStringEncodingNSUTF8StringEncoding)。

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

    • 按照 Elvis 的建议使用 NSData

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

    【讨论】:

    • 我使用了方法 2。这修复了文本,但从字符串末尾删除了一个字符。这是有道理的,因为它正在添加一个字节,但我不确定如何取回它。我通过添加 2 来更新我的 dataLength - 以说明我假设每个字符都被分配使用的两个字节。这是正确的方法吗?我正在使用 NSUnicodeStringEncoding 因为我不希望任何字符丢失/截断。那有意义吗?感谢您的帮助。
    • UTF-8 和 UTF-16 都是 Unicode 编码;选择任何一个都不会失去任何东西。 NSUnicodeStringEncoding 为您提供 UTF-16。大多数人更喜欢 UTF-8,因为它与 ASCII 兼容,而且您不必担心字节顺序。如果您想使用 UTF-16,请将 NSUTF16BigEndianStringEncoding 或 NSUTF16LittleEndianStringEncoding 传递给 lengthOfBytesUsingEncoding:,这将在数据长度中包含 BOM。
    • 如您所知,我对字符编码非常陌生。以前,我认为 UTF-8 始终是 8 位,而 UTF-16 始终是 16。我现在看到它们都可以是相同的最大大小 4 字节。所以现在,我看不到使用 UTF-16 的任何好处。有吗?如果没有,是否有用于 UTF-8 的 NSStringEncoding(我找不到该文档)?感谢您提供所有信息,这对您有很大帮助。
    • 我是个白痴,我看到有 NSUTF8StringEncoding。在寻找它时,我只是查看了 UTF-8 的描述。无论如何 - 我很感激对我的其他问题的任何见解 - 使用 UTF-16 或 UTF-8 有什么好处。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多