字符编码 ASCLL and UNICODE

 

所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.

 

W版本和A版本的API

Windows 支持 Unicode 和 ASCII 编码的字符。Windows 系统 API 凡是以字符串作为参数的 很多具有 W 和 A 两个版本以实现两种不同编码的字符处理。

以MessageBox为例:在程序进行编译和连接时,如果程序在UNICODE环境下,会使用MessageBoxW, 否则使用 MessageBoxA。

 

Unicode与ASCII的转换

Windows 专门提供了若干个 API 来实现对字符编码的转换工作。WideCharToMultiByte、 MultiByteToWideChar、UnicodeToBytes函数可以完成这些工作。

WideCharToMultiByte 函数将 Unicode 字符串转换为多字节字符串,以适应 A 版本的 API;

MultiByteToWideChar函数将多字节字符串转换为了Unicode字符串,以适应W版本 的 API 的参数形式要求。

eg:
#include <Windows.h>
#include <iostream>
using namespace std;

//将单字节char*转化为宽字节wchar_t*

wchar_t* AnsiToUnicode( const char* szStr ) 

    int nLen = MultiByteToWideChar( CP_ACP, 0, szStr, -1, NULL, 0 ); 
    if (nLen == 0) 
    { 
        return NULL; 
    } 
 cout<< "AnsiToUnicode nlen = " << nLen << endl;
    wchar_t* pResult = new wchar_t[nLen]; 
    MultiByteToWideChar( CP_ACP, 0, szStr, -1, pResult, nLen ); 
    return pResult; 

 
//将宽字节wchar_t*转化为单字节char* 
 char* UnicodeToAnsi( const wchar_t* szStr ) 

    int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); 
    if (nLen == 0) 
    { 
        return NULL; 
    } 
 cout<< "UnicodeToAnsi nlen = " << nLen << endl;
    char* pResult = new char[nLen]; 
    WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); 
    return pResult; 
}
int _tmain(int argc, _TCHAR* argv[])
{
 LPWSTR w_str =L"Good";
 LPSTR s_str = "Hello,world!";

 LPWSTR w_str2 =NULL;
 LPSTR s_str2 =NULL;

 s_str2 = UnicodeToAnsi(w_str);
 w_str2 = AnsiToUnicode(s_str);
 printf("s_str2 = %s\n",s_str2);
 wprintf(L"w_str2 = %s\n",w_str2);
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值