Две кодировки, используемые в строке RTF, не будут корректно отображаться в RichTextBox?
-
20-08-2019 - |
Вопрос
Я пытаюсь разобрать некоторый 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>
К моему удивлению, мой браузер сразу же выдал "ńó".