将RTF中的Codepage-1251转换为Unicode的更好方法

时间:2010-03-15 16:05:13

标签: delphi unicode rtf

我试图用Delphi 2010中的各种语言解析RTF(通过MSEDIT),以便以unicode生成HTML。

以俄语/西里尔语为出发点,我发现整个文档代码页是1252(西方),但文本的俄语部分是由字体的字符集(RUSSIAN_CHARSET 204)标识的。

到目前为止,我是:

1)解析RTF时使用AnsiString(或RawByteString)

2)通过字体字符集中的查找来确定CodePage(参见http://msdn.microsoft.com/en-us/library/cc194829.aspx

3)在我的代码中使用查找表进行翻译:(此表格从http://msdn.microsoft.com/en-gb/goglobal/cc305144.aspx生成) - 每个支持的代码页我需要一个表格!

必须有比这更好的方法吗?最好是由OS提供的东西,因此比常数表更不易碎。

1 个答案:

答案 0 :(得分:2)

Charset to codepage表足够小,而且足够静态,我怀疑系统是否提供了这样做的功能。

要进行实际的字符转换,可以使用SysUtils.TEncoding类或System.SetCodePage函数。两者都在内部使用MultiByteToWideString,它使用操作系统提供的查找表,因此您无需维护它们。

使用SetCodePage看起来像这样:

var
  iStart, iStop: Integer;
  RTF, RawText: AnsiString;
  Text: string;
  CodePage: Word;
begin
   ...
   CodePage := CharSetToCodePage(CharSet);
   RawText := Copy(RTF, iStart, iStop - iStart);
   SetCodePage(RawText, CodePage, False); // Set string codepage to Russian without converting it
   Text := string(RawText); // Automatic conversion from string codepage to Unicode