Вопрос

Я создаю пакет данных для отправки через 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.Однако это устарело, поскольку вы не можете указать нужную кодировку.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top