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后:


浙公网安备 33010602011771号