我正在尝试翻译解析 RTF 格式的消息(我需要保留格式标记,所以我不能使用您只需粘贴到 RichTextBox
中并获取 的技巧.PlainText
出)
将字符串 a基bমূcOι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?
)和ূ
(\u2498?
),是\u2478?\u2498?
这很好,但是 Oι
是两个单独的字符 O
和 ι
是 \'cf\'e9
.
有没有一种方法可以确定我正在查看的内容是否应该是一个字符,例如 基
= \'bb\'f9
或两个字符 O
和 ι
= \'cf\'e9
?
我在想也许 \lang
就是它,但事实并非如此,因为 \lang
从第一次设置时就没有改变。我已经考虑了字体中不同 Charset
值的不同代码页,但它似乎没有告诉我是否应该将两个彼此相邻的 Unicode 引用视为双字节字符与否。
如何判断我正在查看的字符应该是双字节(或多字节)还是单字节?
最佳答案
\'xx
转义表示字节,应使用 fcharset
编码进行解释。 (或者可能是 cchs
。如果不存在,则返回到 ansicpg
。)
您需要深入了解编码,以便能够确定单个 \'xx
序列是代表一个字符本身还是仅代表多字节字符的一部分;通常,在使用可用的任何库或操作系统接口(interface)将该字节字符串转换为 Unicode 字符串之前,您会将文本的每个部分作为一个单元来使用,以避免必须为 RTF 支持的每个代码页编写逐字节解析器。
\uxxxx?
转义表示 UTF-16 代码单元。这要简单得多,但 Word[pad] 只在不得已时才生成这种编码形式,因为它与早期的 RTF 版本不兼容。 (?
是接收方无法处理 Unicode 时的回退字符。)
所以:
两个字符
Oι
表示为两个字节转义,因为与该段文本关联的字体使用希腊语单字节编码(字符集 161 = cp1253)。一个字符
<基
表示为两个字节转义,因为与该段文本关联的字体使用的是日语多字节编码(字符集 128 = cp932 ≈ Shift-JIS)。在 Shift-JIS 中,前导\'8a
字节表示即将到来的另一个字节,就像最高位设置范围内的其他各种字节一样(但不是全部)。মূ
这两个字符表示为 Unicode 代码单元转义,因为没有其他选择:没有任何包含孟加拉字符的 RTF 兼容代码页。 (ISCII 的代码页 57003 出现得晚得多。)
关于language-agnostic - 检测 rtf 标记中的多字节和汉字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257366/