Различия Objective-C в строках UTF-8 и UTF-16 в байтах - PullRequest
0 голосов
/ 06 ноября 2011

Я пытаюсь преобразовать NSStrings в байтовые массивы, а затем обратно в NSStrings. Я пытался с NSUnicodeEncoding и NSUTF8StringEncoding. Мой вопрос заключается в том, что когда я перебираю байтовые массивы, я вижу разные данные

Единственное изменение в этом коде состоит в том, что я заменяю NSUTF8StringEncoding на NSUnicodeEncoding и добавляю dataLength + = 2, чтобы он учитывал спецификацию.

NSString *message = @"testing";
NSUInteger dataLength = [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
void *byteData = malloc( dataLength );
NSRange range = NSMakeRange(0, [message length]);
BOOL result =   [message getBytes:byteData maxLength:dataLength usedLength:&actualLength encoding:NSUTF8StringEncoding options:0  range:range remainingRange:&remain];
for( NSUInteger x = 0; x < dataLength; x++ )
{
    NSLog( @"byte data: %s", (char *)byteData);
    int t = (int)*(char *)byteData;
    byteData++;
}

Разница в NSLog: Как NSUTF8StringEncoding я вижу

  • testing`
  • esting`
  • sting`
  • ting`
  • ...

Как NSUnicodeEncoding я вижу

  • пустой
  • т
  • нуль
  • е
  • ...

Значение int t является правильным для данного символа, но я не понимаю, почему byteData так отличается. Я ожидал бы, что они оба будут действовать как NSUnicodeEncoding.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

В UTF8 буква F представлена ​​одним байтом F.Строка «FU» представлена ​​F-байтом ASCII, за которым следует U-байт ASCII.В Юникоде (как используется здесь) каждый символ занимает два байта.Стандартным символам ASCII предшествует нулевой байт.

Непонятно, почему поведение, которое вы видите, не совсем то, что вы ожидаете.В UTF-8 стандартные символы ASCII занимают один байт.В вашей кодировке Unicode занимают два.Так что это точно не будет так же.

0 голосов
/ 06 ноября 2011

Согласно этот ответ , NSUnicodeStringEncoding "является UTF-16 с прямым порядком байтов, которому предшествует метка порядка байтов", поэтому следует ожидать, что результат полностью отличается от UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...