如何发现将RTF十六进制文字转换为Unicode时要使用的代码epage
题
我正在解析Word 2003+生成的RTF 1.5+文件,这些文件可能具有其他语言的内容。此内容通常被编码为十六进制文字('xx)。我想将这些文字转换为Unicode值。
我通过寻找ANSICPG( ansi ansicpg1252)来知道我的文档代码页面。
当我使用ANSICPG代码epage解码为Unicode时,许多语言(例如法语)似乎转换为我期望的Unicode Char值。
但是,当我看到俄罗斯文本(如下)时,编码1252将内容解码为jibberish。
f277 lang1049 langfe1033 langnp1049 insrsid5989826 charrsid6817286 'd1 'd1 'f2 'f0 f0 f0 f0 f0 f0 f0 ' e0 'e7 'e2 'e0 'ed 'e8 'ff。 'dd 'f2 'e0 'f1 'f2 'f0 'e0 'e0 'ed 'e8 e8 'f6 'e0 e0 e0 'ed ed 'e5 e5 'e4 e4 'ee ee 'ee 'eb 'eb ''eb '' e6 'ed 'e0 'ee 'f2 'ee 'e1 'f0 'e0 'e0 'e6 e6 'e0 e0 'f2 'fc 'fc 'f1 'f1 'ff 'ff 'e2 e2 e2 'e0 'e1 'eb 'e8 'f6 'e5 'e2 'e2 'f1 'ee 'e4 e4 e4 'e5 'e5 'f0 f0 'e6 e6 'e0 'ed ed 'ed'e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 。
我认为lang1049,langfe1033,langnp1049应该为我提供线索,以便我可以编程选择一个 不同的 (非默认)他们引用的文本代码页面?如果是这样,我在哪里可以找到说明如何将lang*代码映射到代码epage的信息?还是我应该寻找其他RTF命令/指令来为我提供所需的信息? (或者我必须使用 f277作为字体参考,看看它是否具有关联的代码epage?)
解决方案
\lang
实际上,仅将文本的特定拉伸标记为特定语言,并且不应影响旧的非unicode的代码页面 \'
逃脱。
放一个 \ansicpg
标题中的令牌也许应该这样做,但似乎被单词忽略了(对于原始字节和 \'
逃脱。
还是我必须使用 f277作为字体参考,看看它是否具有关联的代码epage?
看起来那样。更改 \fcharset
无论如何,分配给特定文本的字体是唯一能够改变其对待字节的唯一方法。这个令牌中的代码(请参阅 这里 对于列表),加重,与语言ID或代码页码再次不同。
其他提示
并不清楚,但是您可以使用RichEdit控件来根据MSDN将RTF转换为UTF-8格式:http://msdn.microsoft.com/en-us/library/windows/desktop/bb774304(V=VS.85).aspx查看em_streamout消息的sf_usecodepage。