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.
Может ли кто-нибудь пролить свет на это для меня?
Любая помощь будет принята с благодарностью!
Решение
Правильная кодировка в 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
.Однако это устарело, поскольку вы не можете указать нужную кодировку.