2015-03-30 4 views
2

В моем приложении .NET 3.5 C# я преобразую массив байтов в кодировке unicode в строку.Преобразование Юникода в Линии строк, ведущий знак байтового байта

Массив байт выглядит следующим образом:

{255, 254, 85, 0, 83, 0, 69, 0} 

Использование Encoding.Unicode.GetString(var), преобразовать массив байтов в строку, которая возвращает:

{65279 '', 85 'U', 83 'S' , 69 'E'} 

Ведущий характер, 65279, кажется, Zero Width No-Break Space, который используется как знак байтового заказа в кодировке Unicode, и его внешний вид вызывает проблемы в остальной части моего приложения.

В настоящее время обходной путь, который я использую, - var.Trim(new char[]{'\uFEFF','\u200B'});, который работает просто отлично.

Но на самом деле вопрос, не должен GetString позаботиться об удалении знака порядка байтов? Или я делаю что-то неправильно при преобразовании массива байтов?

+0

@bzlm: _ "Encoding.Unicode, скорее всего, вернет кодировщик UTF-16" _ - нет "вероятно" об этом. Это было сделано _better_, так как это документировано: [«Кодировка для формата UTF-16 с использованием порядка байтов младшего байта».] (Https://msdn.microsoft.com/en-us/library/ system.text.encoding.unicode (v = vs.110) .aspx) –

+1

Почему вы обрезаете '\ u200B'? – xanatos

ответ

1

Нет, GetString() не следует удалять спецификацию. Спецификация на самом деле является вполне допустимым символом Юникода (выбирается специально, потому что, если он отображается в середине файла Unicode, например, если файл был результатом объединения нескольких файлов Unicode, это не повлияет на текст в виде текста) и его необходимо декодировать наряду со всеми другими символами в byte[].

Единственный код, который должен интерпретировать и отфильтровывать спецификацию, будет кодом, который понимает, что данные поступают из некоторого постоянного хранилища, например. StreamReader. И обратите внимание, что это будет сделано только в том случае, если вы не отключите это поведение.

Все, что должно быть сделано GetString(), это интерпретировать фактические закодированные символы и преобразовывать их в текст, который они представляют (конечно, в строках C# хранится внутри как UTF16, так что это очень мало для этого преобразования, когда исходные данные уже находятся в UTF16 :)).

+0

Но откуда взялась эта спецификация? Глядя на массив байтов, я не вижу его двоичного представления. –

+1

@CristianoSousa 255 254 - это «спецификация», т. Е. Пространство. Или вы имели в виду что-то еще? – bzlm

+0

@CristianoSousa: как говорит комментатор bzlm, он находится в ваших исходных данных. '255' ==' 0xff' и '254' ==' 0xfe'. Таким образом, первые два байта в этой кодировке UTF16 с маленьким концом разрешают '0xfeff' или' 65279' десятичные. Так же, как вы видите в расшифрованном тексте. –

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