1. 程式人生 > >Lazarus 1.8 Unicode 字元與UTF8字元的轉換

Lazarus 1.8 Unicode 字元與UTF8字元的轉換

Lazarus 1.8 Unicode 字元與UTF8字元的轉換


我有一個文字檔案,在WINDOWS 7 X64簡體中文版中儲存格式是UCS2,我想用LAZARUS 1.8 寫一工具進行格式化,發現用MEMO1匯入後顯示亂碼,經查,是LAZARUS 1.8 預設用UTF8處理字元,包括MEMO控制元件,所以需要轉碼,但測試了LAZutf8單元的工具都沒有可用的,於是寫下如下轉碼函式:

// UCS2格式文字轉換為UTF8
// UCS2格式以兩個位元組UNICODE編碼字元,所以只有儲存碼值為0XFFFF 之前的字元
// UCS2格式儲存時,是低字先存,高字後存,如嚴字UNICODE編碼為4E25,儲存時先存25,再存4E
// C1,C2為UCS2檔案中連續的兩個位元組

function UCS2ToUTF8(C1,C2:byte):UTF8string;
 var
   SH,SM,SL:Byte;
   VL,VH:Byte;
   V:Word;
 begin
   result:='';

   VL:=C1;  //25
   VH:=C2;  //4E
   V:=VH;
   V:=(V SHL 8)+VL;

   if (V>=$0000) AND (V<=$007F) then
      begin
         result:=Chr(VL);
      end
   else if (v>=$0080) and (v<=$07ff) then
      begin
         SM:=VL SHR 6;
         VL:=%10000000 +(%00111111 AND VL);
         VH:=%11000000 +(VH SHL 2)+SM;
         Result:=chr(VH)+CHR(VL);
      end
   else if (v>=$0800) and (v<=$FFFF) then
      begin
                 SL:=%10000000+(%00111111 AND VL);
                 SM:=%10000000+(VL SHR 6);
                 SM:=SM+((VH SHL 2) AND %00111100);
                 SH:=%11100000+(VH SHR 4);
                 Result:=chr(SH)+CHR(SM)+CHR(SL);
      end;
 end;     

下面是檢測文字檔案格式的函式:
//檢測文字檔案編碼格式

function  TextEncode(FileName:String):string;
var
  fs:TFileStream;
  flag:array[0..1] of byte;
begin
  flag[0]:=0;
  flag[1]:=0;
  fs:=TFileStream.Create(FileName,fmOpenRead);
  ALenth:=fs.Size;
  fs.read(flag,2);
  fs.Free;
  if (flag[0]=$EF) AND (flag[1]=$BB) then
     Result:='UTF-8'
  else if (flag[0]=$FE) AND (flag[1]=$FF) then
     Result:='BigEndianUnicode'
  else if (flag[0]=$FF) AND (flag[1]=$FE) then
     Result:='Unicode'
  else
    Result:='ANSI';
end;

轉碼原理參考文件:字元編碼筆記 阮一峰的部落格文章