汉字在RTF文件中的编码方式
汉字在RTF文件中的存储方式比较特殊,如"电脑报"在RTF文件格式中的编码为:"\'b5\'e7\'c4\'d4\'b1\'a8",让我们来分析它们的编码方式,我们知道,一个汉字由两个字节组成,如"电"字的两个字节的十进制编码分别为:181,231,对应的16进制编码分别为:b5,e7,由此,我们可以知道\'b5\'e7代表的文字是"电",其它的汉字编码可以以此类推。我们可以根据汉字在RTF文件中的编码方式进行算法分析:
1.将汉字转换为RTF编码的函数
function HZ2RTFCode(const sHZ: WideString): string;
var
s, sRTF, sHex1, sHex2: string;
i, iCode1, iCode2: integer;
begin
sRTF := '';
for i := 1 to Length(sHZ) do
begin
s := sHZ[i];
iCode1 := Ord(s[1]);
iCode2 := Ord(s[2]);
sHex1 := LowerCase(IntToHex(iCode1, 2));
sHex2 := LowerCase(IntToHex(iCode2, 2));
if sHex2 = '00' then //非汉字编码
begin
if s = '\' then //用\\显示\
sRTF := sRTF + '\' + s
else
sRTF := sRTF + s;
end else
sRTF := sRTF + Format('\''%s\''%s', [sHex1, sHex2]);
end;
Result := sRTF;
end;
2.将RTF编码转换为汉字的函数
function RTFCode2HZ(const sRTF:string):WideString;
var
s, sHex1, sHex2: string;
sHZ: WideString;
i, iCode1, iCode2, iCount: integer;
begin
sHZ := '';
iCount := Length(sRTF);
i := 1;
while i <= iCount do
begin
if (sRTF[i] = '\') and (sRTF[i + 1] = '''') then //汉字编码
begin
sHex1 := sRTF[i + 2] + sRTF[i + 3];
sHex2 := sRTF[i + 6] + sRTF[i + 7];
iCode1 := StrToInt('$' + sHex1);
iCode2 := StrToInt('$' + sHex2);
s := Chr(iCode1) + Chr(iCode2);
sHZ := sHZ + s;
inc(i, 8);
end else
begin
if (sRTF[i] = '\') then //用\\显示\
begin
s := sRTF[i + 1];
sHZ := sHZ + s;
inc(i, 2);
end else
begin
s := sRTF[i];
sHZ := sHZ + s;
inc(i);
end;
end;
end;
Result := sHZ;
end;