我用了网上比较流行的GB2BIG控件(就是自带源代码和码表的那个程序)。偶然发现Big5下的“銅”无法正常转换到简体的“铜”。不知何故?请大虾帮忙解答。

解决方案 »

  1.   

    楼上正解
    Const LCMAP_SIMPLIFIED_CHINESE = &H2000000
    Private Declare Function LCMapString Lib "kernel32" Alias "LCMapStringA" (ByVal Locale As Long, ByVal dwMapFlags As Long, ByVal lpSrcStr As String, ByVal cchSrc As Long, ByVal lpDestStr As String, ByVal cchDest As Long) As Long下面是c#的,自己改下
    ============================
    调用C#API 作简繁体转换- -
                                           
    1. 输入Big5字符,返回Gb简体字符    //---------------------------------------------------------------------------
        //函数输入Big5字符,返回Gb简体字符
        //---------------------------------------------------------------------------
        AnsiString __fastcall Big2Gb(AnsiString sBig)
        {
         char* pszBig5=NULL; //Big5编码的字符
         wchar_t* wszUnicode=NULL; //Unicode编码的字符
         char* pszGbt=NULL; //Gb编码的繁体字符
         char* pszGbs=NULL; //Gb编码的简体字符
         AnsiString sGb; //返回的字符串
         int iLen=0; //需要转换的字符数
        
         pszBig5=sBig.c_str(); //读入需要转换的字符参数
        
         //计算转换的字符数
         iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ;
         //给wszUnicode分配内存
         wszUnicode=new wchar_t[iLen+1];
         //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar
         MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);
        
         //计算转换的字符数
         iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ;
         //给pszGbt分配内存
         pszGbt=new char[iLen+1];
         //给pszGbs分配内存
         pszGbs=new char[iLen+1];
         //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte
         WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;
        
         //转换Gb码繁体到Gb码简体,使用API函数LCMapString
         LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);
        
         //返回Gb码简体字符
         sGb=pszGbs;
        
         //释放内存
         delete [] wszUnicode;
         delete [] pszGbt;
         delete [] pszGbs;
         
         return sGb;
        } 
    2. 输入Gb字符,返回Big5字符    //---------------------------------------------------------------------------
        //函数输入Gb字符,返回Big5字符
        //---------------------------------------------------------------------------
        AnsiString __fastcall Gb2Big(AnsiString sGb)
        {
         char* pszGbt=NULL; //Gb编码的繁体字符
         char* pszGbs=NULL; //Gb编码的简体字符
         wchar_t* wszUnicode=NULL; //Unicode编码的字符
         char* pszBig5=NULL; //Big5编码的字符
         AnsiString sBig5; //返回的字符串
         int iLen=0; //需要转换的字符数
        
         pszGbs=sGb.c_str(); //读入需要转换的字符参数
        
         //计算转换的字符数
         iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ;
        
         //给pszGbt分配内存
         pszGbt=new char[iLen*2+1];
         //转换Gb码简体到Gb码繁体,使用API函数LCMapString
         LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2);
        
         //给wszUnicode分配内存
         wszUnicode=new wchar_t[iLen+1];
         //转换Gb码到Unicode码,使用了API函数MultiByteToWideChar
         MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen);
        
         //计算转换的字符数
         iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ;
         //给pszBig5分配内存
         pszBig5=new char[iLen+1];
         //转换Unicode码到Big5码,使用API函数WideCharToMultiByte
         WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ;
        
         //返回Big5码字符
         sBig5=pszBig5;
        
         //释放内存
         delete [] wszUnicode;
         delete [] pszGbt;
         delete [] pszBig5;
        
         return sBig5;
        }