首页  编辑  

Unicode,GB,GBK转换

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

Unicode格式:

我们都知道,Windows2000的记事本,可以保存数据为Unicode的格式,那么在记事本中输入的文字,如何保存到文件里面呢?

原来,Unicode的文本和数据,在开始的时候,会有两个字节的标记:FF FE,如果一个Txt文件,开头两个字节是FF FE,那么记事本就认为它是Unicode的格式!此后,每一个符号数据都是以两个字节来保存的!因此,如果你输入了ab两个字母,那么文件的长度就是:2 + 4=6Byte!

MultiByteToWideChar

WideCharToMultiByte

把一个数字如8bd5变成Unicode字符:

Result:=WideChar($8bd5)

function GB2Unicode(GB:string):string;

var

s: string;

 i, j, k: integer;

 a: array [1..1000] of char;

begin

 s:='';

 StringToWideChar(GB, @(a[1]), 500);

 i:=1;

 while ((a[i]<>#0) or (a[i+1]<>#0)) do begin

 j:=Integer(a[i]); k:=Integer(a[i+1]);

 s:=s+Copy(Format('%X ',[k*$100+j+$10000]) ,2,4);

 i:=i+2;

 end;

 Result:=s;

end;

简体和繁体转换:

请参看MSDN的API

LCMapString

它可以实现GB和big5和Unicode之间的转换,不需要什么对照表。

---------------------------------------

{单元功能:利用操作系统API进行中文内码转换和进行简体与繁体转换(注:简体和和繁体都是GB编码,只是字型不相同)

代码收集整理人:李春德

整理日期:2005年8月4日

}

uses

  windows;

 

function Big52GB(BIG5Str : String): AnsiString;

{进行big5转GB内码}

var

 Len: Integer;

 pBIG5Char: PChar;

 pGBCHSChar: PChar;

 pGBCHTChar: PChar;

 pUniCodeChar: PWideChar;

begin

   //String -> PChar

   pBIG5Char := PChar(BIG5Str);

   Len := MultiByteToWideChar(950,0,pBIG5Char,-1,nil,0);

   GetMem(pUniCodeChar,Len*2);

   ZeroMemory(pUniCodeChar,Len*2);

   //Big5 -> UniCode

   MultiByteToWideChar(950,0,pBIG5Char,-1,pUniCodeChar,Len);

   Len := WideCharToMultiByte(936,0,pUniCodeChar,-1,nil,0,nil,nil);

   GetMem(pGBCHTChar,Len*2);

   GetMem(pGBCHSChar,Len*2);

   ZeroMemory(pGBCHTChar,Len*2);

   ZeroMemory(pGBCHSChar,Len*2);

   //UniCode->GB CHT

   WideCharToMultiByte(936,0,pUniCodeChar,-1,pGBCHTChar,Len,nil,nil);

   //GB CHT -> GB CHS

   LCMapString($804,LCMAP_SIMPLIFIED_CHINESE,pGBCHTChar,-1,pGBCHSChar,Len);

   Result := String(pGBCHSChar);

   FreeMem(pGBCHTChar);

   FreeMem(pGBCHSChar);

   FreeMem(pUniCodeChar);

end;

function GB2Big5(GBStr : String): AnsiString;

{进行GB转BIG5内码}

var

 Len: Integer;

 pGBCHTChar: PChar;

 pGBCHSChar: PChar;

 pUniCodeChar: PWideChar;

 pBIG5Char: PChar;

begin

 pGBCHSChar := PChar(GBStr);

 Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);

 GetMem(pGBCHTChar,Len*2+1);

 ZeroMemory(pGBCHTChar,Len*2+1);

 //GB CHS -> GB CHT

 LCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHSChar,-1,pGBCHTChar,Len*2);

 GetMem(pUniCodeChar,Len*2);

 ZeroMemory(pUniCodeChar,Len*2);

 //GB CHT -> UniCode

 MultiByteToWideChar(936,0,pGBCHTChar,-1,pUniCodeChar,Len*2);

 Len := WideCharToMultiByte(950,0,pUniCodeChar,-1,nil,0,nil,nil);

 GetMem(pBIG5Char,Len);

 ZeroMemory(pBIG5Char,Len);

 //UniCode -> Big5

 WideCharToMultiByte(950,0,pUniCodeChar,-1,pBIG5Char,Len,nil,nil);

 Result := String(pBIG5Char);

 FreeMem(pBIG5Char);

 FreeMem(pGBCHTChar);

 FreeMem(pUniCodeChar);

end;

function GBCht2Chs(GBStr : String): AnsiString;

{进行GBK繁体转简体}

var

 Len: Integer;

 pGBCHTChar: PChar;

 pGBCHSChar: PChar;

begin

 pGBCHTChar := PChar(GBStr);

 Len := MultiByteToWideChar(936,0,pGBCHTChar,-1,nil,0);

 GetMem(pGBCHSChar,Len*2+1);

 ZeroMemory(pGBCHSChar,Len*2+1);

 //GB CHS -> GB CHT

 LCMapString($804,LCMAP_SIMPLIFIED_CHINESE,pGBCHTChar,-1,pGBCHSChar,Len*2);

 Result := String(pGBChsChar);

 //FreeMem(pGBCHTChar);

 FreeMem(pGBCHSChar);

end;

function GBChs2Cht(GBStr : String): AnsiString;

{进行GBK简体转繁体}

var

 Len: Integer;

 pGBCHTChar: PChar;

 pGBCHSChar: PChar;

begin

 pGBCHSChar := PChar(GBStr);

 Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);

 GetMem(pGBCHTChar,Len*2+1);

 ZeroMemory(pGBCHTChar,Len*2+1);

 //GB CHS -> GB CHT

 LCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHSChar,-1,pGBCHTChar,Len*2);

 Result := String(pGBCHTChar);

 FreeMem(pGBCHTChar);

 //FreeMem(pGBCHSChar);

end;