В нашем API мы используем byte [] для передачи данных по сети. Все работало нормально, до того дня, когда наши «иностранные» клиенты решили передать/получить символы Юникода.Преобразование символа юникода из байта
Насколько я знаю, символы Unicode занимают 2 байта, однако мы выделяем только 1 байт в массиве байтов.
Вот как мы читаем символ из байт [] массив:
// buffer is a byte[6553] and index is a current location in the buffer
char c = System.BitConverter.ToChar(buffer, m_index);
index += SIZEOF_BYTE;
return c;
Так текущий вопрос является API получает странный характер Unicode, когда я смотрю на шестнадцатеричное Unicode. Я обнаружил, что последний значащий байт правильный, но самый старший байт имеет значение, когда он должен быть 0. Быстрое обходное решение, до сих пор, было 0x00FF & c для фильтрации msb.
Просьба предложить правильный подход к работе с символами Unicode, поступающими из сокета?
Спасибо.
Solution:
Престижность Jon:
символ с = (символ) буфере [m_index];
И, как он упомянул, причина, по которой он работает, заключается в том, что клиент api получает символ, занимающий только один байт, а BitConverter.ToChar использует два, следовательно, проблему в его преобразовании. Я все еще удивляюсь, почему это сработало для некоторого набора персонажей, а не для других, поскольку это должно было провалиться во всех случаях.
Спасибо, ребята, отличные ответы!
«Насколько я знаю, символы Unicode занимают 2 байта», это неправильно. лучшее упрощение - думать, что «ASCII устарел, текстовые потоки являются UTF8» и, следовательно, всегда делают некоторые кодировки/декодирования, чтобы преобразовывать внутреннее в/из UTF8 в любое время, когда вы их вынимаете/в свое приложение. – Javier
Это упрощение неверно, так как оно предполагает UTF-8 всюду - это, конечно же, не так. Да, UTF-8 очень распространен, но если предположить, что это повсеместно, это ошибка. Лучше всего не упрощать: вы всегда должны знать кодировку при кодировании/декодировании. Не предполагайте. –
В этом случае я не предполагаю, что посмотрел на код на стороне сервера и увидел, что он действительно отправляет символ, упакованный в 1 байт (без какой-либо кодировки). Тем не менее, я согласен с тем, что правильное кодирование должно быть исследовано до кодирования/декодирования. Спасибо – 2009-02-18 18:28:46