Objective c 从NSString到字节再回到NSString时获取奇怪字符

Objective c 从NSString到字节再回到NSString时获取奇怪字符,objective-c,cocoa,character-encoding,nsstring,Objective C,Cocoa,Character Encoding,Nsstring,我的问题是,我希望decodedString能够进行测试,但它看起来像汉字。我认为这可能是空终止数据的问题,但似乎这不应该是问题。您想要这样的东西吗 NSString *message = @"testing"; NSUInteger dataLength = [message lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; void *byteData = malloc( dataLength ); NSRange range

我的问题是,我希望decodedString能够进行测试,但它看起来像汉字。我认为这可能是空终止数据的问题,但似乎这不应该是问题。

您想要这样的东西吗

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];

你想要这样的吗

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];

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

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];
您可以执行以下任一操作:

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];
  • 使用指定显式字节顺序的编码(例如,
    NSUTF16BigEndianStringEncoding
    NSUTF16LittleEndianStringEncoding
    NSUTF8StringEncoding

  • 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];
    
  • NSStringEncodingConversionExternalRepresentation
    传递到
    getBytes:maxLength:usedLength:encoding:options:range:
    中的
    选项:
    参数。这将在数据的开头添加一个字节顺序标记

  • 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];
    
  • 按照Elvis的建议,使用NSData

  • 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];
    

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

UTF-16字节顺序在编码和解码之间发生了逆转

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];
您可以执行以下任一操作:

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];
  • 使用指定显式字节顺序的编码(例如,
    NSUTF16BigEndianStringEncoding
    NSUTF16LittleEndianStringEncoding
    NSUTF8StringEncoding

  • 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];
    
  • NSStringEncodingConversionExternalRepresentation
    传递到
    getBytes:maxLength:usedLength:encoding:options:range:
    中的
    选项:
    参数。这将在数据的开头添加一个字节顺序标记

  • 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];
    
  • 按照Elvis的建议,使用NSData

  • 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];
    

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

我认为您的initWithBytes调用中可能缺少长度。我以前确实有过,但我想如果我可以避免使用NSData,我想。为什么要避免NSData?我想单独访问字节-因此,如果可以使用NSString,我认为没有必要遍历NSData然后调用其上的字节来获取数据。我认为您的initWithBytes调用中可能缺少长度。我以前确实有过,但我想如果我可以避免使用NSData,我会这样做。为什么要避免使用NSData?我想单独访问字节-所以我不认为需要遍历NSData,然后调用它上的字节来获取数据,如果我可以使用NSString的话。我使用了方法2。这修复了文本,但从字符串末尾删除了一个字符。这是有道理的,因为它添加了一个字节,但我不知道如何恢复它。我更新了我的dataLength,在其中添加了2,以说明我假设每个字符都被分配使用的两个字节。这是正确的方法吗?我正在使用NSU编码,因为我不希望任何字符丢失/截断。这有意义吗?谢谢你的帮助。UTF-8和UTF-16都是Unicode编码;选择其中一个,你不会失去任何东西。NSU编码提供UTF-16。大多数人喜欢UTF-8,因为它与ASCII兼容,而且您不必担心字节顺序。如果您想使用UTF-16,请将NSUTF16BigEndianStringEncoding或NSUTF16LittleEndianStringEncoding传递给LengthofBytes SusingEncoding:这将在数据长度中包含BOM。正如您所知,我对字符编码非常陌生。以前,我认为UTF-8总是8位,UTF-16总是16位。我现在看到它们可以是相同的最大大小4字节。所以现在,我看不到使用UTF-16的任何好处。有吗?如果没有,是否有UTF-8的NSStringEncoding(我找不到文档)?谢谢你提供的所有信息,这帮了大忙。我是个白痴,我知道有NSUTF8StringEncoding。在查找它时,我只查看了UTF-8的描述。不管怎样,我希望大家能深入了解我的另一个问题——使用UTF-16或UTF-8有什么好处吗。谢谢,我用了方法二。这修复了文本,但从字符串末尾删除了一个字符。这是有道理的,因为它添加了一个字节,但我不知道如何恢复它。我更新了我的dataLength,在其中添加了2,以说明我假设每个字符都被分配使用的两个字节。这是正确的方法吗?我正在使用NSU编码,因为我不希望任何字符丢失/截断。这有意义吗?谢谢你的帮助。UTF-8和UTF-16都是Unicode编码;选择其中一个,你不会失去任何东西。NSU编码提供UTF-16。大多数人喜欢UTF-8,因为它与ASCII兼容,而且您不必担心字节顺序。如果您想使用UTF-16,请将NSUTF16BigEndianStringEncoding或NSUTF16LittleEndianStringEncoding传递给LengthofBytes SusingEncoding:这将在数据长度中包含BOM。正如您所知,我对字符编码非常陌生。以前,我认为UTF-8总是8位,UTF-16总是16位。我现在看到它们可以是相同的最大大小4字节。所以现在,我看不到使用UTF-16的任何好处。有吗?如果没有,是否有UTF-8的NSStringEncoding(我找不到文档)?谢谢你提供的所有信息,这帮了大忙。我是个白痴,我知道有NSUTF8StringEncoding。在查找它时,我只查看了UTF-8的描述。不管怎样,我希望大家能深入了解我的另一个问题——使用UTF-16或UTF-8有什么好处吗。谢谢
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];