Обнаружение многобайтовых и китайских символов в разметке RTF - PullRequest
2 голосов
/ 24 ноября 2011

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

Возьмите код RTF для строки a基bমূcΟιd, вставленной прямо в Wordpad:

{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Calibri;}{\f1\fswiss\fcharset128 MS PGothic;}{\f2\fnil\fcharset1 Shonar Bangla;}{\f3\fswiss\fcharset161{\*\fname Arial;}Arial Greek;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 a\f1\fs24\'8a\'ee\f0\fs22 b\f2\fs24\u2478?\u2498?\f0\fs22 c\f3\fs24\'cf\'e9\f0\fs22 d\par
}

Сложно разобраться, если у вас мало общего с RTF. Итак, вот что я смотрю на

\'8a\'ee\f0\fs22 b\f2\fs24\u2478?\u2498?\f0\fs22 c\f3\fs24\'cf\'e9

Обратите внимание, что (u+57FA) равен \'8a\'ee, но মূ, который на самом деле представляет собой два символа (\u2478?) и (\u2498?), равен \u2478?\u2498? это нормально, но Οι, который состоит из двух отдельных символов Ο и ι, равен \'cf\'e9.

Есть ли способ определить, смотрю ли я на что-то, что должно быть одним символом, например = \'bb\'f9 или двумя символами Ο и ι = \'cf\'e9?

Я думал, что, возможно, это \lang, но это совсем не так, потому что \lang не меняется с момента его первой установки. Я уже учел разные кодовые страницы из разных значений Charset в шрифтах, но, похоже, мне ничего не сказано о том, следует ли мне рассматривать две ссылки на Юникод рядом друг с другом как двухбайтовый символ или нет.

Как я могу узнать, должен ли символ, на который я смотрю, быть двухбайтовым (или многобайтовым) или однобайтовым?

Ответы [ 2 ]

7 голосов
/ 25 ноября 2011

\'xx экранирование представляет байты и должно интерпретироваться с использованием кодировки fcharset.(Или, возможно, cchs. Откат к ansicpg, если его нет.)

Вам необходимо тщательно знать эту кодировку, чтобы можно было решить, представляет ли отдельная последовательность \'xx символ самостоятельно.или является только частью многобайтового символа;как правило, вы будете использовать каждый раздел текста как единицу перед преобразованием этой байтовой строки в строку Unicode, используя любую имеющуюся у вас библиотеку или интерфейс ОС, чтобы избежать необходимости писать побайтные синтаксические анализаторы для каждой кодовой страницы, поддерживаемой RTF.

\uxxxx? экранирование представляет кодовые единицы UTF-16.Это намного проще, но Word [pad] производит эту форму кодирования только в качестве крайней меры, потому что она не совместима с более ранними версиями RTF.(? является резервным символом, когда приемник не может справиться с Юникодом.)

Итак:

  • Два символа Οι представлены какдва байтовых выхода, потому что шрифт, связанный с этим отрезком текста, использует греческую однобайтовую кодировку (кодировка 161 = cp1253).

  • Один символ представлен как дваbyte-escapes, потому что шрифт, связанный с этим отрезком текста, использует многобайтовую кодировку в Японии (charset 128 = cp932 ≈ Shift-JIS).В Shift-JIS ведущий байт \'8a сигнализирует о появлении следующего байта, как и другие другие в верхнем битовом диапазоне (но не все).

  • два символа মূ представлены как экранированные единицы кода Unicode, потому что другого варианта нет: не существует RTF-совместимой кодовой страницы, содержащей символы бенгали.(Кодовая страница 57003 для ISCII появилась намного позже.)

1 голос
/ 25 ноября 2011

RTF имеет теги для указания кодовой страницы / кодировки, используемой для кодирования символов Юникода. Фактические шестнадцатеричные коды для символов - это байтовые октеты, используемые указанной кодировкой. В этом случае \ansicpg1252 для кодовой страницы Ansi 1252.

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