繁简转换

作者: ivy1982
标题: 繁简转换
关键字: 繁简转换
分类: 个人专区
密级: 公开
(评分: , 回复: 0, 阅读: 6) »»
繁简转换
关键字: 繁简转换
我根据VC++改的
在两个操作环境下都测试能过

//*****************************************************
//Function BIG5ToGB
//Para :BIG5 String
//Return : GB  AnsiString
//BIG5 -> UniCode ->GB CHT -> GB CHS
//Function GBToBIG5
//Para : GB String
//Return : BIG5 AnsiString
//GB CHS -> GB CHT -> UniCode -> Big5
//******************************************************

unit UGBBig5Convert;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TGBBIG5Convert = class(TObject)
  public
    class function BIG5ToGB(BIG5Str : String): AnsiString;
    class function GBToBIG5(GBStr : String): AnsiString;
  end;
 

implementation

{
******************************** TGBBIG5Convert ********************************
}
class function TGBBIG5Convert.BIG5ToGB(BIG5Str : String): AnsiString;
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);
  ZeroMemory(pUniCodeChar,Len);
  //Big5 -> UniCode
  MultiByteToWideChar(950,0,pBIG5Char,-1,pUniCodeChar,Len);
 
  Len := WideCharToMultiByte(936,0,pUniCodeChar,-1,nil,0,nil,nil);
 
  Try
    GetMem(pGBCHTChar,Len*2);
    ZeroMemory(pGBCHTChar,Len*2);
 
    GetMem(pGBCHSChar,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);
  Finally
    FreeMem(pGBCHTChar);
    FreeMem(pGBCHSChar);
  end;
end;

class function TGBBIG5Convert.GBToBIG5(GBStr : String): AnsiString;
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
  pUniCodeChar: PWideChar;
  pBIG5Char: PChar;
begin
  pGBCHSChar := PChar(GBStr);
  Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);
 
  Try
    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);
     Try
        GetMem(pBIG5Char,Len);
        ZeroMemory(pBIG5Char,Len);
        //UniCode -> Big5
        WideCharToMultiByte(950,0,pUniCodeChar,-1,pBIG5Char,Len,nil,nil);
 
        Result := String(pBIG5Char);
     Finally
        FreeMem(pBIG5Char);
     end;
  Finally
    FreeMem(pGBCHTChar);
  end;
end;


end.  

posted @ 2010-08-25 23:32  覆雨翻云  阅读(302)  评论(0编辑  收藏  举报