Lazarus 1.8 Unicode 字元與UTF8字元的轉換
阿新 • • 發佈:2018-12-18
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;
轉碼原理參考文件:字元編碼筆記 阮一峰的部落格文章