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后:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2023-11-01 lazarus在windows使用zeos并指定数据库驱动的路径时,当路径包含中文运行会出错。
2023-11-01 Lazarus可用开源资源