Две кодировки, используемые в строке RTF, не будут корректно отображаться в RichTextBox?

StackOverflow https://stackoverflow.com/questions/494470

Вопрос

Я пытаюсь разобрать некоторый RTF, который я получаю обратно с сервера.Для большей части текста, который я получаю обратно, это работает нормально (и использование элемента управления RichTextBox выполнит эту работу), однако некоторые RTF-файлы, похоже, содержат дополнительную "кодировку", и некоторые символы повреждаются.

Исходная строка выглядит следующим образом (и содержит некоторые символы, используемые в польском языке)::

ąćęłńóśźż

Строка RTF с шестнадцатеричными кодированными символами, которая отправляется обратно, выглядит следующим образом

{\lang1045\langfe1045\f16383 {\'b9\'e6\'ea\'b3{\f7 \'a8\'bd\'a8\'ae}\'9c\'9f\'bf}}

У меня возникли проблемы с декодированием ńó символы в возвращаемой строке, по-видимому, представлены двумя шестнадцатеричными значениями каждый, тогда как остальная часть строки представлена (как и ожидалось) одиночными шестнадцатеричными значениями.

Использование элемента управления RichTextBox для "разбора" RTF приводит к искажению текста (два рассматриваемых символа отображаются как четыре разных нежелательных символа).

Если бы я сам закодировал простую строку в шестнадцатеричный формат, используя ожидаемую кодовую страницу (1250, Latin 2, кодовая страница ANSI для lcid 1045), я бы получил следующее:

\'B9\'E6\'EA\'B3\'F1\'F3\'9C\'9F\'BF

Я теряюсь в догадках относительно того, как я могу правильно расшифровать {\f7 \'a8\'bd\'a8\'ae} часть возвращаемой строки, которая должна соответствовать ńó.

Обратите внимание, что нет определения шрифта для \f7 в заголовке RTF и строка выглядят нормально при просмотре непосредственно на сервере, что означает, что символы (если они повреждены) повреждены где-то при преобразовании перед отправкой.

Я не уверен, что проблема на стороне сервера (поскольку я это не контролирую), но поскольку сервер используется для большой работы по переводу, я предполагаю, что возвращаемая строка в порядке.

Я просматривал спецификации RTF, но не могу найти никаких намеков относительно этого типа комбинации кодировок.

Это было полезно?

Решение

Я не знаю, почему это происходит, но кодировка, похоже, ГБК (или что-то достаточно похожее).

Возможно, сервер пытается выполнить какое-то "умное" сопоставление, чтобы найти символы, или кодировкой символов сервера по умолчанию является GBK или около того, и эти символы (и только они) также встречаются в GBK, поэтому он предпочитает это.

Я выяснил это, добавив оскорбительные шестнадцатеричные коды (A8 BD A8 AE) в виде байтов в простой HTML-файл, чтобы я мог просмотреть кодировки моего браузера и посмотреть, соответствует ли что-нибудь:

<html><body>¨½¨®</body></html>

К моему удивлению, мой браузер сразу же выдал "ńó".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top