Получение странных символов при переходе из NSString в байты, а затем обратно в NSString - PullRequest
1 голос
/ 05 ноября 2011
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 будет тестировать, но вместо этого он выглядит как китайские символы.Я думал, что это может быть проблема с данными с нулевым символом в конце, но, похоже, это не должно быть проблемой.

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Вы хотите что-то подобное?

    NSString *message = @"testing";    
    NSData *bytes = [message dataUsingEncoding:NSUTF8StringEncoding];
    NSString* messageDecoded = [[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding];
    NSLog(@"decoded: %@", messageDecoded);
2 голосов
/ 05 ноября 2011

Порядок байтов UTF-16 становится обратным между кодированием и декодированием.

Вы можете выполнить одно из следующих действий:

  • Используйте кодировку, которая указывает явный порядок байтов (например, NSUTF16BigEndianStringEncoding, NSUTF16LittleEndianStringEncoding, NSUTF8StringEncoding).

  • Передать NSStringEncodingConversionExternalRepresentation параметру options: в getBytes:maxLength:usedLength:encoding:options:range:. Это добавляет метку порядка байтов к началу данных.

  • Используйте NSData, как предложил Элвис.

В наши дни UTF-8 является предпочтительной кодировкой Unicode в большинстве случаев.

...