首页  编辑  

汉字在RTF文件中的编码方式

Tags: /超级猛料/Format.格式,单位/Encode.编码、格式/   Date Created:

汉字在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;