NSStream, UTF8String & NSString ... Грязное преобразование - PullRequest
1 голос
/ 16 июня 2009

Я создаю пакет данных для отправки по NSStream на сервер. Я пытаюсь разделить два фрагмента данных с помощью «§» (код 167 ascii). Так устроен сервер, поэтому мне нужно постараться не выходить за эти рамки ...

unichar asciiChar = 167;  //yields @"§"
[self setSepString:[NSString stringWithCharacters:&asciiChar length:1]]; 

sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString];

NSLog(sendData);

const uint8_t *rawString=(const uint8_t *)[sendData UTF8String];

[oStream write:rawString maxLength:[sendData length]];  

Таким образом, конечный результат должен выглядеть следующим образом ... и это так, когда sendData впервые создается:

USER User§Pass 

однако при получении на стороне сервера это выглядит так:

//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas

... строка-разделитель имеет длину два, а последняя буква обрезается в команде. Я полагаю, что это вызвано преобразованием UTF8.

Может кто-нибудь пролить свет на это для меня?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

6 голосов
/ 16 июня 2009

Правильная кодировка в UTF-8 для этого символа - это двухбайтовая последовательность 0xC2 0xA7, которую вы получаете. ( Fileformat.info неоценим для этого материала.) Это из набора LATIN-1, так что вы почти наверняка захотите использовать NSISOLatin1StringEncoding вместо NSUTF8StringEncoding для получения однобайтовой кодировки 167. Посмотрите на NSString -dataUsingEncoding:.

1 голос
/ 16 июня 2009

То, что у вас есть и что вы хотите передать, на самом деле не является строкой UTF-8, и технически это не us-ascii, потому что это всего 7 бит. Вы хотите передать произвольный массив байтов в соответствии с протоколом, с которым вы работаете. Два поля байтового массива, имя пользователя и пароль, сами могут быть строками UTF-8, но с разделителем 167 это не может быть строкой UTF-8.

Вот некоторые варианты, которые я вижу:

  • Создайте байтовый массив uint8_t*, используя как минимум два различных объекта NSString плюс код 167. Это будет необходимо, если имя пользователя или пароль могут содержать символы, отличные от ascii.
  • Используйте метод NSString getBytes:maxLength:usedLength:encoding:options:range:remainingRange и установите encoding на NSASCIIStringEncoding. Если вы делаете это, вы должны подтвердить в другом месте, что ваши имя пользователя и пароль только us-ascii.
  • Используйте метод NSString getCString. Однако это устарело, поскольку вы не можете указать нужную кодировку.
...