NSStream, UTF8String & NSString... Бесполезное преобразование

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

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.

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

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

Ответ 1

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

Ответ 2

То, что у вас есть и что вы хотите передать, на самом деле не является строкой 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. Если вы сделаете это, вы должны подтвердить в другом месте, что ваше имя пользователя и пароль - только-ascii.
  • Используйте метод NSString getCString. Однако это устарело, потому что вы не можете указать нужную кодировку.