作一个mis,有简体和繁体两种用户。数据库中存简体中文,当有繁体用户使用时,作转换再显示。有没有什么好的方法能比较高效的转换数据集里面的数据。这只是我的一个思路。如果有更好的解决办法请各位赐教!!!分不够可以再加!!

解决方案 »

  1.   

    出自:超级猛料Unicode,GB,GBK转换    
        
    Unicode格式:我们都知道,Windows2000的记事本,可以保存数据为Unicode的格式,那么在记事本中输入的文字,如何保存到文件里面呢?原来,Unicode的文本和数据,在开始的时候,会有两个字节的标记:FF FE,如果一个Txt文件,开头两个字节是FF FE,那么记事本就认为它是Unicode的格式!此后,每一个符号数据都是以两个字节来保存的!因此,如果你输入了ab两个字母,那么文件的长度就是:2 + 4=6Byte!MultiByteToWideCharWideCharToMultiByte把一个数字如8bd5变成Unicode字符:Result:=WideChar($8bd5) function GB2Unicode(GB:string):string;vars: string;i, j, k: integer;a: array [1..1000] of char;begins:='';StringToWideChar(GB, @(a[1]), 500);i:=1;while ((a[i]<>#0) or (a[i+1]<>#0)) do beginj:=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的APILCMapString它可以实现GB和big5和Unicode之间的转换,不需要什么对照表。
     
       
      

  2.   

    出自:超级猛料在Win2K下自己写很容易,下面给你几个函数,函数名里有String的是AnsiString版,没有的是PChar版usesSysUtils, Windows;function StrConv(pszSrc : PChar; cpSrc : UINT; pszDest : PChar; cbDest :Longint; cpDest : UINT) : Longint;varbuf : PWideChar;cwLen : LongInt;begincwLen := MultiByteToWideChar(cpSrc,0,pszSrc,-1,nil,0);GetMem(buf, (cwLen+1) * SizeOf(WideChar));ZeroMemory(buf, (cwLen+1) * SizeOf(WideChar));MultiByteToWideChar(cpSrc,0,pszSrc,StrLen(pszSrc),buf,cwLen+1);Result := WideCharToMultiByte(cpDest,0,buf,-1,pszDest,cbDest,nil,nil);FreeMem(buf);end;function StringConv(const Src : string; cpSrc, cpDest : UINT) : string;varbuf : PChar;len : Longint;beginlen := StrConv(PChar(Src), cpSrc, nil, 0, cpDest);GetMem(buf, len);ZeroMemory(buf, len);StrConv(PChar(Src), cpSrc, buf, len, cpDest);Result := string(buf);FreeMem(buf);end;function CHTStringToCHSString(Src : string) : string;varbuf : PChar;len : Integer;beginlen := LCMapString($804, // LCID_CHINESE_SIMPLIFIEDLCMAP_SIMPLIFIED_CHINESE,PChar(Src),-1,nil,0);GetMem(buf, len);ZeroMemory(buf, len);LCMapString($804, // LCID_CHINESE_SIMPLIFIEDLCMAP_SIMPLIFIED_CHINESE,PChar(Src),-1,buf,len);Result := string(buf);FreeMem(buf);end;function CHSStringToCHTString(Src : string) : string;varbuf : PChar;len : Integer;beginlen := LCMapString($404, // LCID_CHINESE_SIMPLIFIEDLCMAP_TRADITIONAL_CHINESE,PChar(Src),-1,nil,0);GetMem(buf, len);ZeroMemory(buf, len);LCMapString($404, // LCID_CHINESE_SIMPLIFIEDLCMAP_TRADITIONAL_CHINESE,PChar(Src),-1,buf,len);Result := string(buf);FreeMem(buf);end;function CHTToCHS(pszSrc, pszDest : PChar; cbDest : Longint) : Longint;beginResult := LCMapString($804, // LCID_CHINESE_SIMPLIFIEDLCMAP_SIMPLIFIED_CHINESE,pszSrc,-1,pszDest,cbDest);end;function CHSToCHT(pszSrc, pszDest : PChar; cbDest : Longint) : Longint;beginResult := LCMapString($404, // LCID_CHINESE_SIMPLIFIEDLCMAP_TRADITIONAL_CHINESE,pszSrc,-1,pszDest,cbDest);end;function Big5StringToGBString(Src : string) : string;beginResult := CHTStringToCHSString(StringConv(Src, 950, 936));end;function Big5ToGB(pszSrc, pszDest : PChar; cbDest : Longint) : Longint;varbuf : PChar;len : Integer;beginlen := StrLen(pszSrc)+1;GetMem(buf, len*2);ZeroMemory(buf, len*2);StrConv(pszSrc, 950, buf, 936, len*2);Result := CHTToCHS(buf, pszDest, cbDest);FreeMem(buf);end;function GBStringToBig5String(Src : string) : string;beginResult := CHSStringToCHTString(StringConv(Src, 936, 950));end;function GBToBig5(pszSrc, pszDest : PChar; cbDest : Longint) : Longint;varbuf : PChar;len : Integer;beginlen := StrLen(pszSrc)+1;GetMem(buf, len*2);ZeroMemory(buf, len*2);StrConv(pszSrc, 936, buf, 950, len*2);Result := CHSToCHT(buf, pszDest, cbDest);FreeMem(buf);end;