// j2f.cpp : 简体(gb)==>繁体==>big5的过程
// 反向转换是类似的.
// 注意直接从简体-->big5不能做到一一对应.会有很多?出现,
// 故此需要先转成繁体.再转成big5.
// 我感觉这种方法应当和winnt或office里提供的繁简或字符集互转是一致的.#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <conio.h>
using namespace std;void j2f(const string &s)
{
    int n=s.length ();    
    int r=LCMapString(
        MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),
        LCMAP_TRADITIONAL_CHINESE,
        s.c_str (),s.length (),NULL,0);
    if (!r) cout <<"error :"<<GetLastError()<<endl;
    char *ft=new char[r+1];
    r=LCMapString(
        MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),
        LCMAP_TRADITIONAL_CHINESE,
        s.c_str (),s.length (),ft,r+1);//这个api搞掂简体转繁体,下面会打印繁体出来
    if (r) {
        ft[r]=0;        
        cout<<ft<<endl;
        wchar_t *pws=new wchar_t[r+1];
        int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);
        BOOL f=FALSE;
        r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5
        ft[r1]=0;
        cout<<ft<<"(";        
        for (int i=0;i<r1;i++) {
            cout<<"";
            printf("0x%02x ",(BYTE)ft[i]);
        }
        cout<<")"<<endl;
        delete [] pws;
    }
    
    delete []ft;
}//从标准输入简体国标-->big5繁体标准输出,输入两个空行退出
int main(int argc, char* argv[])
{    
    
    for(;;){
        char line[1024];
        cin.getline (line,sizeof(line));
        string s(line);    
        if (!cin ||s.length ()==0) break;
        j2f(s);
    }
    _getch();
    return 0;
}

解决方案 »

  1.   

    真牛,为什么你能做出来j2f(),不能自己做个f2j()呢?我倒很想试一试,就是不太熟悉stl里的那些东西,帮你UP
      

  2.   

    这段可以转换,但会有“?”号出现。void CGB2Big5Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    string s("讽礛OK罢繷祇祇癩");    int n=s.length ();    
        int r=LCMapString(
            MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_TRADITIONAL),SORT_CHINESE_BIG5),
            LCMAP_SIMPLIFIED_CHINESE,
            s.c_str (),s.length (),NULL,0);    if (!r) AfxMessageBox("wrong");
        char *ft=new char[r+1];
        r=LCMapString(
            MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_TRADITIONAL),SORT_CHINESE_BIG5),
            LCMAP_SIMPLIFIED_CHINESE,
            s.c_str (),s.length (),ft,r+1);//这个api搞掂简体转繁体,下面会打印繁体出来    if (r) {
            ft[r]=0;        
            AfxMessageBox(ft);
            wchar_t *pws=new wchar_t[r+1];
            int r1=MultiByteToWideChar(950,0,ft,r,pws,r+1);
            BOOL f=FALSE;
            r1=WideCharToMultiByte(936,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5
            ft[r1]=0;
    CString aTemp(ft);
    AfxMessageBox(aTemp);        cout<<ft<<"(";        
            for (int i=0;i<r1;i++) {
                cout<<"";
                printf("0x%02x ",(BYTE)ft[i]);
            }
            cout<<")"<<endl;
            delete [] pws;
        }
        
        delete []ft;}