在rtf标记中检测多字节和汉字

时间:2011-11-24 12:51:26

标签: language-agnostic unicode localization rtf multibyte

我正在尝试翻译解析RTF格式的邮件(我需要保留格式化标签,以便我不能使用您只需粘贴到RichTextBox并获取.PlainText的技巧)

将直接粘贴到Wordpad中的字符串a基bমূcΟιd的RTF代码:

{\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?)和{ {1}}(),\u2498?即可,但\u2478?\u2498?是两个单独的字符ΟιΟ ι }。

有没有办法确定我是否正在查看应该是一个字符的内容,例如\'cf\'e9 = 或两个字符\'bb\'f9Ο = { {1}}?

我在考虑ι可能是它,但事实并非如此,因为\'cf\'e9在第一次设置时没有变化。我已经考虑了字体中不同\lang值的不同代码页,但它似乎没有告诉我是否应该将两个Unicode引用彼此相邻作为双字节字符

如何判断我正在查看的字符应该是双字节(或多字节)还是单字节?

2 个答案:

答案 0 :(得分:7)

\'xx转义表示字节,应使用fcharset编码进行解释。 (或者可能是cchs。如果不存在,则回退到ansicpg

您需要知道编码是否能够决定单个\'xx序列是单独表示一个字符还是仅仅是多字节字符的一部分;通常,在使用您可用的任何库或OS接口将该字节字符串转换为Unicode字符串之前,您将使用每个文本部分作为一个单元,以避免必须为RTF支持的每个代码页编写逐字节解析器。

\uxxxx?转义表示UTF-16代码单元。这要简单得多,但是Word [pad]仅作为最后的手段产生这种形式的编码,因为它与早期的RTF版本不兼容。 (?是接收器无法处理Unicode时的后备字符。)

所以:

  • 两个字符Οι表示为两个字节转义符,因为与该段文本关联的字体使用希腊单字节编码(字符集161 = cp1253)。

    < / LI>
  • 一个字符表示为两个字节转义符,因为与该段文本关联的字体使用日语多字节编码(字符集128 =cp932≈Shift-JIS)。在Shift-JIS中,前导\'8a字节表示另一个字节,最高位设置范围内的其他字节(但不是全部)也是如此。

  • 两个字符মূ表示为Unicode代码单元转义符,因为没有其他选项:没有任何包含孟加拉语字符的RTF兼容代码页。 (ISCII的代码页57003来得晚得多。)

答案 1 :(得分:1)

RTF具有用于指定用于编码Unicode字符的代码页/编码的标签。字符的实际十六进制代码是指定编码使用的字节八位字节。在这种情况下,\ansicpg1252代表Ansi代码页1252。