我想要得到汉字的Unicode编码,是不是应该先得到汉字的GB码,然后再通过GB码转换为Unicode编码啊?例如,对于“你好”,先得到“你好”的GB码,然后再把它的GB码转化为Unicode编码,这个过程怎样来实现呢?有Api函数可以来调用吗?   希望大家来帮忙!

解决方案 »

  1.   

    i write one function to do this:
    //将UTF8字符串转换为gb2312
    _bstr_t CSync::ConvertUTF8toGB2312(XString str)
    {
    int n=MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),NULL,0);
    WCHAR * pChar = new WCHAR[n+1];
    n=MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pChar,n);
    pChar[n]=0;
    OLECHAR * pTempBuffer = pChar;
    BSTR strPassword = SysAllocString(pTempBuffer);
    _bstr_t aa (strPassword,FALSE);
    SysFreeString(strPassword);
    delete []pChar;
    return aa;
    }
    if you want to Convert GB2312 to UTF8,it like this function
      

  2.   

    头文件ANSIAPI.h
    函数W2A(Unicode字符串,字符串缓冲,长度)
      

  3.   

    int MultiByteToWideChar(
      UINT CodePage,         // code page
      DWORD dwFlags,         // character-type options
      LPCSTR lpMultiByteStr, // string to map
      int cbMultiByte,       // number of bytes in string
      LPWSTR lpWideCharStr,  // wide-character buffer
      int cchWideChar        // size of buffer
    );
      

  4.   

    1.下面这个是从Unicode到Ansi的换:
    unsigned char buf[129]; //发送缓冲区
    ZeroMemory(buf,sizeof(buf)); //缓冲区清零
    CString tmpstr(str); //复制要发送的字符串
    int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数
    CP_ACP, //根据ANSI code page转换
    WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替
    tmpstr.GetBuffer(str.GetLength()), //要转换的字符串地址
    str.GetLength(), //要转换的个数
    0, //转换后字符串放置的地址
    0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
    0, //缺省
    )
    2.下面这个是从Ansi到Unicode的换:
    int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数
    CP_ACP,
    MB_COMPOSITE,
    szBuf, //要转换的Ansi字符串
    -1, //自动计算长度
    0,
    0
            );
    unsigned char szBuff[MAX_BUFF];
    ZeroMemory(szBuff,sizeof(szBuff));
    MultiByteToWideChar( //从Ansi转换到Unicode字符
    CP_ACP,
    MB_COMPOSITE,
    szBuf,
    -1,
    (LPWSTR)szBuff, //转换到tmpstr
    widecharlen //最多转换widecharlen个Unicode字符
            );
      

  5.   

    读取网卡的MAC地址
    广东深圳 温卫江在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作为某种标识之用,如控制程序的合法性等。下文介绍如何用Microsoft VisualC++ 6.0开发这样的程序。这里采用的方法是通过Windows 9x/NT/Win2000中内置的NetApi32.DLL的功能来实现的。首先通过发送NCBENUM命令,获取网卡的数目和每张网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。注意:这里的网卡是指捆绑了NetBEIU协议的通信协议栈,可以在网卡的属性处查看到。请运行VC++,打开一个新的工程,选择创建一个Win32 Console程序,然后按下文输入代码,并请参见其中的注释:#include "stdafx.h"#include <windows.h>#include <wincon.h>#include <stdlib.h>#include <stdio.h>#include <time.h>// 因为是通过NetAPI来获取网卡信息,所以需要包含其题头文件nb30.h#include <nb30.h>typedef struct _ASTAT_{ADAPTER_STATUS adapt;NAME_BUFFERNameBuff [30];} ASTAT, * PASTAT;ASTAT Adapter;// 定义一个存放返回网卡信息的变量// 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的void getmac_one (int lana_num){NCB ncb;UCHAR uRetCode;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBRESET;ncb.ncb_lana_num = lana_num // 指定网卡号// 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化uRetCode = Netbios( &ncb );printf( "The NCBRESET return code is: 0x%x \n", uRetCode );memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBASTAT;ncb.ncb_lana_num = lana_num; // 指定网卡号strcpy((char *)ncb.ncb_callname,"*" );ncb.ncb_buffer = (unsigned char *) &Adapter; // 指定返回的信息存放的变量ncb.ncb_length = sizeof(Adapter);// 接着,可以发送NCBASTAT命令以获取网卡的信息uRetCode = Netbios( &ncb );printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );if ( uRetCode == 0 ){// 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802printf( "The Ethernet Number[%d] is: %02X%02X-%02X%02X-%02X%02X\n",lana_num,Adapter.adapt.adapter_address[0],Adapter.adapt.adapter_address[1],Adapter.adapt.adapter_address[2],Adapter.adapt.adapter_address[3],Adapter.adapt.adapter_address[4],Adapter.adapt.adapter_address[5] );}}int main(int argc, char* argv[]){NCB ncb;UCHAR uRetCode;LANA_ENUM lana_enum;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBENUM;ncb.ncb_buffer = (unsigned char *) &lana_enum;ncb.ncb_length = sizeof(lana_enum);// 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等uRetCode = Netbios( &ncb );printf( "The NCBENUM return code is: 0x%x \n", uRetCode );if ( uRetCode == 0 ){printf( "Ethernet Count is : %d\n\n", lana_enum.length);// 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址for ( int i=0; i<lana_enum.length; ++i)getmac_one( lana_enum.lana[i]);}return 0;}此时,按F7编译,按F5运行即可。
      

  6.   

    MultiByteToWideChar,看msdn的帮助
      

  7.   

    to  Free_Man(浪迹天涯) :I'm finding the code how to read MAC addr, 3X!
      

  8.   

    Free_Man(浪迹天涯)和liuxianzhi(碧渊),你们俩牛人啊!哈哈
      

  9.   

    //------------------------//
    // Convert char * to BSTR //
    //------------------------//
    inline BSTR ConvertStringToBSTR(const char* pSrc)
    {
    if(!pSrc) return NULL;

    DWORD cwch;

    BSTR wsOut(NULL); if(cwch = ::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, NULL, 0))//get size minus NULL terminator
    {
    cwch--;
    wsOut = ::SysAllocStringLen(NULL, cwch);

    if(wsOut)
    {
    if(!::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, wsOut, cwch))
    {
    if(ERROR_INSUFFICIENT_BUFFER == ::GetLastError())
    return wsOut;
    ::SysFreeString(wsOut);//must clean up
    wsOut = NULL;
    }
    }

    };

    return wsOut;
    };//------------------------//
    // Convert BSTR to char * //
    //------------------------//
    inline char* ConvertBSTRToString(BSTR pSrc)
    {
    if(!pSrc) return NULL;

    DWORD cb,cwch = ::SysStringLen(pSrc);//convert even embeded NULL

    char *szOut = NULL;

    if(cb = ::WideCharToMultiByte(CP_UTF8, 0, pSrc, cwch + 1, NULL, 0, 0, 0))//CP_ACP
    {
    szOut = new char[cb];
    if(szOut)
    {
    szOut[cb - 1]  = '\0';

    if(!::WideCharToMultiByte(CP_UTF8, 0, pSrc, cwch + 1, szOut, cb, 0, 0))//CP_ACP
    {
    delete []szOut;//clean up if failed;
    szOut = NULL;
    }
    }
    } return szOut;
    };
      

  10.   

    to  pomelowu(羽战士) :
    "Free_Man(浪迹天涯)和liuxianzhi(碧渊),你们俩牛人啊!哈哈"“助人为快乐之本”嘿嘿~~!!
      

  11.   

    用MultiByteToWideChar就可以把ASCII转为unicode现在我有一个问题
    怎样把UFT8码转入unicode或ascii码
    ???
      

  12.   

    #include "comdef.h"
    char *str1="你好";
    _bstr_t str=str1;
    WCHAR *str2=str;
    str2就是你要的UNICODE码