读书人

怎么用C++ BUILDER实现繁体转简体

发布时间: 2012-03-28 15:40:03 作者: rapoo

如何用C++ BUILDER实现繁体转简体?
网上搜了一堆,没看见用C++ BUILDER成功解决的呀。BCB从ORACLE数据库里取出的是繁体,如何将数据转换为简体呢?程序运行环境为简体中文XP。感谢!

[解决办法]

C/C++ code
//.hpublic:        // User declarations    __fastcall TForm1(TComponent* Owner);    void __fastcall GBK2GB(char *szBuf);};//---------------------------------------//.cpp__fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner){    Edit1->Text = "中人民共和";}//---------------------------------------// GBK码转GB2312码// 中人民共和 --> 中华人民共和国void __fastcall TForm1::GBK2GB(char *szBuf){    if(!strcmp(szBuf, ""))        return;    int nStrLen = strlen(szBuf);    WORD wLCID = MAKELCID(MAKELANGID            (LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);    int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);    if(!nReturn)        return;    char *pcBuf = new char[nReturn + 1];    try    {        wLCID = MAKELCID(MAKELANGID                (LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);        LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);        strncpy(szBuf, pcBuf, nReturn);    }    __finally    {        delete []pcBuf;    }}void __fastcall TForm1::Button1Click(TObject *Sender){    char szBuf[255];    AnsiString Str  =   Edit1->Text ;    strcpy(szBuf,Str.c_str());    GBK2GB(szBuf);    Edit2->Text = AnsiString(szBuf);}//---------------------------------------
[解决办法]
出处
http://www.ccrun.com/article.asp?i=634&d=04g63p
[解决办法]
我以前用的互转的函数,供参考:

//----------------------------
//函数输入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;
}


//---------------------------------------
//函数输入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);


ShowMessage(pszGbt);
//给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;
}

读书人网 >C++ Builder

热点推荐