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