秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
lazarus richmemo在linux打开GBK内码的rtf不能显示中文,但在linux编辑保存的rtf可以显示中文:

在Windows richmemo显示的rtf:

打开windows保存的rtf文件,中文使用GBK内码:

【中国人】 对应的GBK内码:

\'d6\'d0\'b9\'fa\'c8\'cb

linux保存的rtf中文使用转为10进制的Unicode内码
【中国人】 对应的十进制Unicode内码:

\u20013  \u22269  \u20154

处理方法:
很简单,在linux打开GBK的rtf文件时,将GBK内码转UTF8,再将UTF8转为Unicode,最后将转换后的字符串赋值给RichMemo.rtf就可以。
HexToDec:

function HexToDec(HexStr: string): Integer;
begin
   Result:= StrToInt('$' + HexStr);
end;

GBK内码转UTF8:

cp936toutf8(chr(HexToDec(copy(tmp,i+2,2)))+chr(HexToDec(copy(tmp,i+6,2))));

UTF8转Unicode:

function utf8toUnicode(ss:UnicodeString):string;
var
  i:int64;
begin
  Result := '';
  for i := 1 to Length(ss) do
  begin
    Result := Result + '\u' + IntToStr(word(ss[i]))+'  ';
  end;
end;

最后将转换为Unicode的字符串赋值给RichMemo.rtf:

RichMemo.rtf:=rtfstr;

richmemo在linux 银河麒麟 for aarch64显示的Demo:


Unicode格式的rtf在windows可以不用转换。
注意:
如果rtf文件是richmemo在linux生成的,将Unicode转换GBK格式后在windows会显示乱码,需要将fcharset0改为fcharset134才能正确显示中文。

{\rtf1\ansi\ansicp1252\deff0\deflan1033{\fonttbl{\f0\fcharset0 Noto Sans CJK SC;}}\f0\fs24\ulnone \pard\li0\sl200\slmult1 \u20013  \u22269  \u20154  123}


fcharset0改为fcharset134后: 

 

posted on 2024-11-01 09:11  秋·风  阅读(282)  评论(0)    收藏  举报