Как узнать, какую кодовую страницу использовать при преобразовании шестнадцатеричных литералов RTF в Unicode? - PullRequest
5 голосов
/ 24 сентября 2010

Я анализирую файлы RTF 1.5+, сгенерированные Word 2003+, которые могут содержать содержимое на других языках. Этот контент обычно кодируется как шестнадцатеричные литералы (\ 'xx). Я хотел бы преобразовать эти литералы в значения Unicode.

Я знаю кодовую страницу моего документа по поиску ansicpg (\ ansi \ ansicpg1252).

Когда я использую кодовую страницу ansicpg для декодирования в Unicode, многие языки (например, французский), кажется, преобразуются в ожидаемые значения символов Unicode.

Однако, когда я вижу текст на русском языке (как показано ниже), кодовая страница 1252 декодирует содержимое на махинацию.

\ f277 \ lang1049 \ langfe1033 \ langnp1049 \ insrsid5989826 \ charrsid6817286 \ 'd1 \' f2 \ 'f0 \' e0 \ 'ed \' e8 \ 'f6 \' fb \ 'e1 \' e5 \ 'e7 \' ed \ 'e0 \' e7 \ 'e2 \' e0 \ ' Ed \ 'е8 \' FF. \ 'Дд \' f2 \ 'e0 \' f1 \ 'f2 \' f0 \ 'e0 \' ed \ 'e8 \' f6 \ 'e0 \' ed \ 'e5 \' e4 \ 'ee \' eb \ 'e6 \' ed \ ' e0 \ 'ee \' f2 \ 'ee \' e1 \ 'f0 \' e0 \ 'e6 \' e0 \ 'f2 \' fc \ 'f1 \' ff \ 'e2 \' f2 \ 'e0 \' e1 \ ' еь \ 'е8 \' f6 \ 'e5 \ 'e2 \' f1 \ 'ee \' e4 \ 'e5 \' f0 \ 'e6 \' e0 \ 'ed \' e8 \ 'e8.

Я предполагаю, что lang1049, langfe1033, langnp1049 должны предоставить мне подсказки, чтобы я мог программным путем выбрать другую (не по умолчанию) кодовую страницу для текста, на который они ссылаются? Если да, где я могу найти информацию, объясняющую, как сопоставить код lang * с кодовой страницей? Или я должен искать какую-то другую команду / директиву RTF, чтобы предоставить мне информацию, которую я ищу? (Или я должен использовать \ f277 в качестве ссылки на шрифт и посмотреть, есть ли у него связанная кодовая страница?)

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

\lang на самом деле помечает только отдельные фрагменты текста как на определенном языке и не должно влиять на то, какая кодовая страница должна использоваться для старых не-Unicode \' экранирований.

Помещение токена \ansicpg в заголовок, возможно, должно сделать это, но, похоже, Word игнорирует его (как для необработанных байтов, так и для \' экранирования.

Или я должен использовать \ f277 в качестве ссылки на шрифт и посмотреть, есть ли у него связанная кодовая страница?

Это выглядит так. Изменение \fcharset шрифта, назначенного определенному фрагменту текста, - это единственный способ, которым я могу заставить Word изменить то, как он обрабатывает байты. Коды в этом лексеме (см., Например, здесь для списка), что еще больше ухудшается, либо с идентификатором языка, либо с номером кодовой страницы.

1 голос
/ 19 октября 2011

Это не так понятно, но вы можете использовать элемент управления RichEdit для преобразования RTF в формат UTF-8 в соответствии с MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/bb774304(v=vs.85).aspx Посмотрите SF_USECODEPAGE для сообщения EM_STREAMOUT.

...