Objective c 从NSString到字节再回到NSString时获取奇怪字符
我的问题是,我希望decodedString能够进行测试,但它看起来像汉字。我认为这可能是空终止数据的问题,但似乎这不应该是问题。您想要这样的东西吗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
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];
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];
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];