Кодер Silverlight UTF8 выдает дурацкий вывод - PullRequest
1 голос
/ 14 октября 2010

Я часами пытаюсь отследить ошибку, и она сводится к этому:

Dim length as Integer = 300
Dim buffer() As Byte = binaryReader.ReadBytes(length)
Dim text As String = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length)

Проблема в том, что буфер содержит 300 байт, но длина строки 'text' теперь равна 285. Когда я преобразую его обратно в байты, длина составляет 521 байт ... WTF?

Тот же код обычного приложения WinForms отлично работает. Данные, читаемые двоичным считывателем, представляют собой строку в кодировке UTF8. Есть идеи, почему Silverlight играет забавных пижонов?

1 Ответ

0 голосов
/ 14 октября 2010

Бьюсь об заклад, ваш поток содержит некоторые символы, которые требуют более одного байта.UTF8 использует один байт, когда это возможно, но использует больше байтов, когда символ находится вне диапазона ASCII.

Это объясняет, почему ваш буфер длиннее строки (300 против 285).

Пример :

string: "t      e      s      t      ä        " (length = 5 -last char takes 2 bytes)
bytes:   0x74 | 0x65 | 0x73 | 0x74 | 0xc3 0xa4  (length = 6)

Что касается того, почему это становится еще длиннее, когда вы конвертируете текст обратно в байты, я предпочитаю (также учитывая размер 521, который вы получаете), что вы используетеEncoding.Unicode вместо Encoding.UTF8 для выполнения преобразования.Unicode всегда использует два байта для каждого символа.

(кстати. Очевидно, это не имеет ничего общего с Silverlight. Вы, вероятно, тестируете код с двумя разными строками в Winforms против Silverlight. Не беспокойтесь, мы всесовершил глупые ошибки вроде этого :-))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...