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