湘里妹子学术网

 找回密码
 注册
查看: 3317|回复: 1

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

[复制链接]
发表于 2005-3-16 13:23:22 | 显示全部楼层 |阅读模式
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[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;
   }

##############################################
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[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, wszUnicode, -1, NULL,0, NULL, NULL);
       //给pszBig5分配内存
       pszBig5=new char[iLen+1];
       //转换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编码的字符
       PSTR  pszGbt          = NULL; //Gb编码的繁体字符
       PSTR  pszGbs          = NULL; //Gb编码的简体字符
       int  iLen            = 0;    //需要转换的字符数

       //计算转换的字符数
       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, 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, 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;
}
发表于 2005-3-16 13:32:00 | 显示全部楼层
这个是最简易的方法了,好处是简单易行,不过有一些限制:
1)与操作系统相关,无法移植到其他平台;
2)转换效率低,速度比较慢;
3)转换效果差,即使使用他的unicode简体、繁体转换后再转换到本地编码,仍然有不少字无法转换显示成“?”。
4)使用汉字到汉字一一对应,没有任何智能判断;
5)它的Unicode映射表不知道如何更新,不知道什么补丁才能保持其与最新的Unicode完全同步?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|湘里妹子学术网 ( 粤ICP备2022147245号 )

GMT++8, 2024-3-29 23:36 , Processed in 0.064720 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表