NSStream, UTF8String & NSString... Грязное преобразование

Я создаю пакет данных для отправки по 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 ответа

Решение

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

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