RTF字符串中使用的两个编码在RichTextBox中无法正确显示?

时间:2009-01-30 04:16:21

标签: c# encoding richtextbox hex rtf

我正在尝试解析一些RTF,我从服务器回来了。对于大多数文本我回来这很好(并使用RichTextBox控件将完成工作),但是一些RTF似乎包含一个额外的“编码”,一些字符被破坏。

原始字符串如下(并包含波兰语中使用的一些字符):

ąćęłńóśźż

发回的十六进制编码字符的RTF字符串如下所示

{\lang1045\langfe1045\f16383 {\'b9\'e6\'ea\'b3{\f7 \'a8\'bd\'a8\'ae}\'9c\'9f\'bf}}

我在解码返回的字符串中的ńó字符时出现问题,它们似乎分别由两个十六进制值表示,而字符串的其余部分由单个十六进制值表示(按预期)

使用RichTextBox控件“解析”RTF会导致损坏文本(有问题的两个字符显示为四个不同的不需要的字符)。

如果我使用预期的代码页(1250,拉丁语2,lcid 1045的ANSI代码页)将自己的纯字符串编码为十六进制,我会得到以下内容:

\'B9\'E6\'EA\'B3\'F1\'F3\'9C\'9F\'BF

我迷失了如何正确解码返回字符串的 {\ f7 \'a8 \'bd \'a8 \'ae} 部分应该对应ñó

请注意,RTF标头中没有 \ f7 的字体定义,并且直接在服务器上查看时字符串看起来很正常,这意味着字符(如果它们已损坏)在某处损坏了发送前的转换。

我不确定问题是否在服务器端(因为我无法控制),但由于服务器用于大量翻译工作,我假设返回的字符串没问题。

我一直在阅读RTF规范,但无法找到有关此类编码组合的任何提示。

1 个答案:

答案 0 :(得分:1)

我不知道为什么会这样,但编码似乎是GBK(或类似的东西)。

也许服务器尝试进行一些“聪明”的匹配来查找字符,或者服务器的默认字符编码是GBK左右,这些字符(只有那些)也出现在GBK中,因此它更喜欢。

我发现通过将违规的十六进制代码(A8 BD A8 AE)作为字节添加到一个简单的HTML文件中,所以我可以浏览浏览器的编码并查看是否有匹配:

<html><body>¨½¨®</body></html>

令我惊讶的是,我的浏览器马上想出了“ñó”。