2009-06-16 10 views
1

Я создаю пакет данных, который нужно отправить через NSStream на сервер. Я пытаюсь отделить две части данных с помощью «§» (код ascii 167). Это путь построен сервер, так что мне нужно, чтобы попытаться остаться в пределах этих границ ...NSStream, UTF8String & NSString ... Messy Conversion

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 

... строка Seperator стала два в длину, а последняя буква становится обрезаны из команды. Я считаю, что это стало причиной преобразования UTF8.

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

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

+0

«'§' (ascii code 167)« Нет такой вещи, как код ascii 167. ASCII по определению определяет только 128 символов (т. Е. Доходит до 127). Ваш персонаж может быть 167 в некоторой кодировке, такой как Latin-1. – user102008

ответ

6

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

+0

но [NSStream write:] специально запрашивает UTF ... я что-то упустил? – Dutchie432

+2

NSStream не имеет метода записи, я предполагаю, что вы имеете в виду [NSOutputStream write]. Он принимает const uint8_t * и длину. Константа uint8_t * не является строкой UTF-8, это массив байтов. –

+1

Perfect - это сработало: const uint8_t * rawString = (const uint8_t *) [sendData cStringUsingEncoding: NSISOLatin1StringEncoding]; – Dutchie432

1

То, что у вас есть и что вы хотите передать, на самом деле не является строкой UTF-8, и это технически не us-ascii, потому что это всего лишь 7 бит. Вы хотите передать произвольный массив байтов в соответствии с протоколом, с которым вы работаете. Два поля массива байтов, имя пользователя и пароль могут сами быть строками UTF-8, но с разделителем 167 это не может быть строка UTF-8.

Вот некоторые варианты, которые я вижу:

  • Построить массив uint8_t* байтов с использованием по меньшей мере двух различных NSString объектов плюс 167 код. Это будет необходимо, если имя пользователя или пароль могут содержать символы, отличные от ascii.
  • Использовать метод NSStringgetBytes:maxLength:usedLength:encoding:options:range:remainingRange и установить encoding на NSASCIIStringEncoding. Если вы это сделаете, вы должны подтвердить в другом месте, что ваше имя пользователя и пароль - только usii.
  • Использование метода NSStringgetCString. Однако это устарело, потому что вы не можете указать нужную кодировку.

 Смежные вопросы

  • Нет связанных вопросов^_^