我试图用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提供的东西,因此比常数表更不易碎。
答案 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