【发布时间】:2014-05-17 11:58:33
【问题描述】:
我正在开发一个 RTF 解析器,但在处理 unicode 时遇到了一些困难。
RTF 规范规定“大于 32767 的 Unicode 值必须表示为负数”(http://www.biblioscape.com/rtf15_spec.htm#Heading9),为了获得 unicode 数值,我们将 65536 添加到这些负数中。
我通过设置包含 unicode 字符 32767 和 32768 的文档来测试该场景。Word(Mac 上的 v2011)为这两个字符生成以下 RTF 语法:
\u32767\'5f\loch\af556\hich\af31506\dbch\f556 \uc2\u-32768\'97\'73
对于第二个,-32768+65536 是预期的 32768。所以 \uNNNN 命令是有意义的。
我的问题在于文本转义序列,例如末尾的 \'97\'73。我不明白为什么会在那里。我可以编写我的解析器来忽略像这样链接到 \uNNNN 命令末尾的命令。但是我对比了TextEdit的RTF输出,它只输出了文本转义序列:
\uc0\u32767 \'97\'73
这似乎是一个双字节 unicode 转义序列。而那种 \' 文本转义是十六进制的。但是 0x9773 是 38771,而不是 32768,所以我不明白如何从该数据中提取所需的 unicode 值。有什么想法吗?
更新:我进行了一些进一步的测试,以了解 TextEdit 如何处理字符代码 32767 - 32777。它们在 RTF 中看起来像这样:
\u32767
\'97\'73
\'98\'56
\u32770
\'8d\'6c
\'e3\'cc
\'8e\'d2
\'e3\'cb
\u32775
\u32776
\'c2\'56
此 RTF 将在 TextEdit 和 Word 中正确加载,因此显然它是有效的。我只是在这里看不到模式。
【问题讨论】:
标签: rtf