使用值解析unicode>;来自RTF文件的32767

使用值解析unicode>;来自RTF文件的32767,rtf,Rtf,我正在研究一个RTF解析器,在处理unicode时遇到了一些困难 RTF规范规定“大于32767的Unicode值必须表示为负数”(),为了获得Unicode数值,我们将65536添加到这些负数中 我通过设置一个unicode字符32767和32768的文档来测试这个场景。Word(Mac上的v2011)为这2个字符生成以下RTF语法: \u32767\'5f\loch\af556\hich\af31506\dbch\f556 \uc2\u-32768\'97\'73 对于第二个,如预期,-3

我正在研究一个RTF解析器,在处理unicode时遇到了一些困难

RTF规范规定“大于32767的Unicode值必须表示为负数”(),为了获得Unicode数值,我们将65536添加到这些负数中

我通过设置一个unicode字符32767和32768的文档来测试这个场景。Word(Mac上的v2011)为这2个字符生成以下RTF语法:

\u32767\'5f\loch\af556\hich\af31506\dbch\f556 \uc2\u-32768\'97\'73
对于第二个,如预期,-32768+65536为32768。因此\unnn命令是有意义的

我的问题是文本转义序列,比如结尾的'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中的\u标记后跟回退字符数,以表示使用ASCII或多字节字符集的Unicode字符。这是为了向后兼容不支持\u标记的旧RTF读取器。表示Unicode字符所需的回退字符数由\uc标记指定。多字节字符集的Unicode字符需要多个回退字符来表示,因此\uc标记值为2或更多。大多数现代RTF阅读器只会忽略回退字符,因此它们的值不再重要。我希望这能回答你关于模式的问题