У меня есть процесс, который пытается декодировать разные кодировки строк из двоичного потока. Я получаю некоторое поведение, которое не совсем укладывается в моей голове, когда я перехожу через него. В частности, что я делаю:
- получить максимальное количество байтов, которые будут использоваться для кодирования символа в данной кодировке
- получить количество байтов из потока
- используйте
Encoding.GetCharCount
, чтобы определить, сколько символов могло быть закодировано в этих байтах (может быть 0, один или два...) - если это не ноль, я использую
Encoding.GetString
для извлечения символов из массива байтов - Затем я вычисляю, сколько байтов было использовано для кодирования извлеченных символов, и продвигаю индекс потока на эту сумму.
- если количество декодируемых байтов оказывается равным нулю, я продвигаю индекс на один байт и повторяю все снова... таким образом я ожидаю, что не пропущу ни одного декодируемого символа.
Кстати, если кто-то заметит какое-либо неверное предположение, сделанное выше, не стесняйтесь сказать об этом...
Мои декодеры настроены на выброс DedcoderFallbackExceptions
, когда они не могут декодировать заданный набор байтов. Что меня смущает, так это то, что иногда возникает исключение, когда я вызываю GetCharCount
, а иногда это происходит, когда я вызываю GetString
. Есть ли причина, по которой это должно происходить? Ожидается ли это на самом деле? Я хотел бы иметь возможность надежно проверять наличие печатных символов в как можно меньшем количестве мест - в настоящее время я делаю это в нескольких местах.
Есть предположения?
спасибо, Брайан
БОЛЬШОЕ ОБНОВЛЕНИЕ: кажется, что мое первоначальное описание проблемы немного отсутствует. Позвольте мне добавить еще несколько предпосылок к проблеме:
- поток может быть чрезвычайно большим — он не помещается в память большинства пользователей
- в любом заданном месте в потоке я точно не знаю, что я в начале текста, в середине текста
- в любом месте потока я не знаю, нахожусь ли я в середине или в начале многобайтового символа
- поток будет содержать много материала, который на самом деле не является текстом, а также небольшое количество различных кодировок
Надеюсь, это прояснит некоторые вопросы. Ответы до сих пор были очень полезными! Пожалуйста, продолжайте!