UNICODE 和 ANSI 互转

时不常就要用一下,老是记不住,放空间里,做个备忘录了。

1。char数组转化为CString。
(1)方法一:
    char cBuf[] = {0x31,0x32,0x33};   // _T("123")
    CString str = _T("");
#ifdef _UNICODE
    // Ansi码转化为unicode码
    WCHAR wTmp[BUF_SIZE] = {};
    // 转换为unicode码
    if (0 == MultiByteToWideChar(CP_ACP,0,(LPCSTR)cBuf,-1,wTmp,BUF_SIZE)) {
        assert(false);
    } else {
        CString strTmp(wTmp);
    }
#else
    CString strTmp(cBuf);
#endif // _UNICODE

(2)方法二:
    char cBuf[] = {0x31,0x32,0x33};   // _T("123")
    CString str = _T("");
#ifdef _UNICODE
    USES_CONVERSION;
    LPTSTR pStr = A2W((char*)cBuf);
    str.Format(_T("%s"),pStr);
#else
    str.Format(_T("%s"),cBuf);
#endif // _UNICODE


2。wchar数组转化为CString。
(1)方法一:
    wchar cBuf[] = {0x31,0x00,0x32,0x00,0x33,0x00};   // _T("123")
    CString str = _T("");
#ifdef _UNICODE
    CString strTmp(cBuf);
#else
    // unicode码转化为Ansi码
    char aTmp[BUF_SIZE] = {};
    // 转换为ANSI码
    if (0 == WideCharToMultiByte(CP_ACP,0,cBuf,-1,aTmp,BUF_SIZE,NULL,NULL)) {
        assert(false);
    } else {
        CString strTmp(aTmp);
    }
#endif // _UNICODE


(2)方法二:
    wchar cBuf[] = {0x31,0x00,0x32,0x00,0x33,0x00};   // _T("123")
    CString str = _T("");
#ifdef _UNICODE
    CString strTmp(cBuf);
#else
    // unicode码转化为Ansi码
    USES_CONVERSION;
    char* pStr = W2A(strAlarmId);
    str.Format(_T("%s"),pStr);
#endif // _UNICODE 

 

 

//-----------------------------------------------------总结-------------------------------------------------------------

ansi以2个字节表示一个字符,unicode以一个字节表示一个字符。比如'0',unicode编码表示为0x0030,而ansi表示为0x30,就这个差别。但是表现在文件中时,一般区分文件是unicode还是ansi,就是要看文件的开始两个字节是不是0xFEFF,是则为unicode否即为ansi。

1. 不要出现在程序中出现这样的定义 wchar_t fullstop = L"hello";这是奇怪的定义,这个本意是想让字符fullstop等于字符"hello",但是要知道"hello"只有在unicode编码文件中才能识别为hello这个单词。而vc6,它也是文本处理器,它默认的编码标准是ansi encoding,所以写上这样的一句表达示,会有些奇怪的问题出现,结果肯定是不对的。但是到了EVC 4.0 或者VS2005 中必须要这样写因为这两个开发环境是unicode 编码的。所以处理字符串的时候如CString 类型一定要进行多字节的转换,也就是告诉编译器把unicode(2字节) 转换到ansi(1字节),经典转换方法有两种如下:

1. CString to ansi char

CString m_address;

char ansiRemoteHost[255];
ZeroMemory(ansiRemoteHost,255);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_address,wcslen(m_address),
 ansiRemoteHost,wcslen(m_address),NULL,NULL);

ansi char to CString

CString MyExam::CharToUnicode(BYTE* buf, DWORD bufSize)
{

CString csTemp;
WCHAR *UnicodeStr=new WCHAR[bufSize+1];
DWORD UnicodeSize=MultiByteToWideChar(CP_ACP,0,
           (LPCSTR)buf,bufSize+1,UnicodeStr,(DWORD)bufSize+1);
csTemp=UnicodeStr;
delete [] UnicodeStr;
return (csTemp);
}

2.   利用wcstombs and mbstowcs

CString to ansi char

CString m_sendData;

char* sendBuf=new char[m_sendData.GetLength()*2];

wcstombs(sendBuf,m_sendData,m_sendData.GetLength());

ansi char to CString

CString GetLocalIP()

{

HOSTENT* LocalAddress;

char * Buff=new char[256];

TCHAR *wBuff=new TCHAR[256];

memset(Buff,'/0',256);

memset(wBuff,L'/0',256*sizeof(TCHAR));

if(gethostname(Buff,256)==0)

{

mbstowcs(wBuff,Buff,256);

LocalAddress=gethostbyname(Buff);

memset(Buff,L'/0',256);

sprintf(Buff,"%d.%d.%d.%d/0",LocalAddress->h_addr_list[0][0]&0xff,LocalAddress->h_addr_list[0][1]&0x00ff,LocalAddress->h_addr_list[0][2]&0x0000ff,LocalAddress->h_addr_list[0][3]&0x000000ff);

memset(wBuff,L'/0',256*sizeof(TCHAR));

mbstowcs(wBuff,Buff,256);

strReturn=wBuff;

 

}

delete [] Buff;

delete [] wBuff;

return strReturn;

}

只要掌握这两种转化方法在unicode 的环境中进行编程就不回出现问题了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值