秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  278 随笔 :: 0 文章 :: 308 评论 :: 20万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
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   秋·风  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2023-11-01 lazarus在windows使用zeos并指定数据库驱动的路径时,当路径包含中文运行会出错。
2023-11-01 Lazarus可用开源资源
点击右上角即可分享
微信分享提示