Artvine 发表于 2005-3-16 13:23:22

用 API 作简繁体转换(程式碼)

Robert
電郵: zsc771120@yahoo.com.cn
P.S.Win9x/ME及NT4.0之前版本是不支持LCMapString函式裡面LCMAP_SIMPLIFIED_CHINESE及LCMAP_TRADITIONAL_CHINESE這兩個參數,使用時須注意。

CODE

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;
    //转换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;
    //给pszGbs分配内存
    pszGbs=new char;
    //转换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;
    //转换Gb码简体到Gb码繁体,使用API函数LCMapString
    LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2);
   
    //给wszUnicode分配内存
    wszUnicode=new wchar_t;
    //转换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;
    //转换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;
   }
##############################################
CODE

成了:

#include <windows.h>
#include <iostream>
#include <tchar.h>

PSTR __fastcall Gb2Big(PSTR sGb);
PSTR __fastcall Big2Gb(PSTR pszBig5);

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
       PSTR pszTemp = Gb2Big("aaa");

       cout << pszTemp << endl;
       cout << Big2Gb(pszTemp) << endl;

       return 0;
}

//---------------------------------------------------------------------------
//函数输入Gb字符,返回Big5字符
//---------------------------------------------------------------------------
PSTR __fastcall Gb2Big(PSTR pszGbs)
{
       PSTR pszGbt            = NULL; //Gb编码的繁体字符
       PWSTR wszUnicode      = NULL; //Unicode编码的字符
       PSTR pszBig5          = NULL; //Big5编码的字符
       PSTR sBig5;                  //返回的字符串
       int iLen=0;                  //需要转换的字符数

       //计算转换的字符数
       iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0);

       //给pszGbt分配内存
       pszGbt=new char;
       //转换Gb码简体到Gb码繁体,使用API函数LCMapString
       LCMapString(0x0804, LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2);

       //给wszUnicode分配内存
       wszUnicode=new wchar_t;
       //转换Gb码到Unicode码,使用了API函数MultiByteToWideChar
       MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen);

       //计算转换的字符数
       iLen=WideCharToMultiByte (950, 0, wszUnicode, -1, NULL,0, NULL, NULL);
       //给pszBig5分配内存
       pszBig5=new char;
       //转换Unicode码到Big5码,使用API函数WideCharToMultiByte
       WideCharToMultiByte (950, 0, wszUnicode, -1, pszBig5,iLen, NULL, NULL);

       //返回Big5码字符
       sBig5=pszBig5;

       //释放内存
       delete [] wszUnicode;
       delete [] pszGbt;

       return pszBig5;
}

//---------------------------------------------------------------------------
//函数输入Big5字符,返回Gb简体字符
//---------------------------------------------------------------------------
PSTR __fastcall Big2Gb(PSTR pszBig5)
{
       PWSTR wszUnicode      = NULL; //Unicode编码的字符
       PSTRpszGbt          = NULL; //Gb编码的繁体字符
       PSTRpszGbs          = NULL; //Gb编码的简体字符
       intiLen            = 0;    //需要转换的字符数

       //计算转换的字符数
       iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0);
       //给wszUnicode分配内存
       wszUnicode=new wchar_t;
       //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar
       MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);

       //计算转换的字符数
       iLen=WideCharToMultiByte (936, 0, wszUnicode, -1, NULL,0, NULL, NULL);
       //给pszGbt分配内存
       pszGbt=new char;
       //给pszGbs分配内存
       pszGbs=new char;
       //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte
       WideCharToMultiByte (936, 0, wszUnicode, -1, pszGbt,iLen, NULL, NULL);

       //转换Gb码繁体到Gb码简体,使用API函数LCMapString
       LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);

       //释放内存
       delete [] wszUnicode;
       delete [] pszGbt;

       return pszGbs;
}

getright 发表于 2005-3-16 13:32:00

这个是最简易的方法了,好处是简单易行,不过有一些限制:
1)与操作系统相关,无法移植到其他平台;
2)转换效率低,速度比较慢;
3)转换效果差,即使使用他的unicode简体、繁体转换后再转换到本地编码,仍然有不少字无法转换显示成“?”。
4)使用汉字到汉字一一对应,没有任何智能判断;
5)它的Unicode映射表不知道如何更新,不知道什么补丁才能保持其与最新的Unicode完全同步?
页: [1]
查看完整版本: 用 API 作简繁体转换(程式碼)