【问题标题】:Parsing unicode with values > 32767 from RTF files从 RTF 文件中解析值 > 32767 的 unicode
【发布时间】: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


    【解决方案1】:

    RTF 中的 \u 标记后跟回退字符数,以使用 ASCII 或多字节字符集表示 Unicode 字符。这是为了向后兼容不支持 \u 标签的旧 RTF 阅读器。表示 Unicode 字符所需的备用字符数由 \uc 标签指定。多字节字符集的 Unicode 字符需要多个后备字符来表示它,因此 \uc 标记值为 2 或更大。大多数现代 RTF 阅读器会简单地忽略后备字符,因此它们的值不再重要。我希望这能回答你关于模式的问题。

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多