Visual Studio里的ASCII编码和unicode编码

ASCII码是较早期使用的编码,用单字节表述,只能表示255种字符,远远不能满足国际需要,例如中文就无法用ASCII码表示
   unicode用双字节表述,能表示65535种字符,可以覆盖全球所有的语言

2 Windows对于unicode的支持非常重视,从Window NT内核开始,其底层API全部都是unicode编码,COM组件也必须使用unicode编码
   从VS 2010开始,所有新建的项目,默认都支持unicode编码,VC6.0默认支持ASCII编码

3 Visual Studio里设置字符编码的地方为:解决方案(右键)-->配置属性-->常规-->字符集
设置完了之后,编译器会对大量的内置类型做宏定义的切换,例如
#ifdef _UNICODE
typedef wchar_t TCHAR
typedef LPTSTR  LPWSTR
#else
typedef char TCHAR
typedef LPTSTR  LPSTR
#endif

4 Visual Studio里在字符串前面加上"L",就是告诉编译器,这是一个unicode字符串

    char *szDemo = "abcd";  //单字节表ASCII述方法
      wchar_t *wszDemo = L"abcd";  //双字节Unicode表述方法,没有L编不过
    FindWindowW(L"abc",L"ert");    //双字节Unicode表述方法,没有L编不过
    FindWindowA("abc", "ert");     //单字节表ASCII述方法

6 szDemo 在内存中的存储方式是这样的:
61 62 63 64 00
wszDemo在内存中的存储方式是这样的:
61 00 62 00 63 00 64 00 00 00

6 同一功能的Windows API做了2种
 FindWindowW   wchar_t   宽字符unicode形式的API    W是wide
 FindWindowA    char        单字符ASCii形式的API         A是ANSI
FindWindow 其实就是 FindWindowA
FindWindow FindWindowA函数会判断传入的字符串编码类型,如果需要会先进行了字符转换,再调用FindWindowW
转换函 数就是 MultiByteToWideChar反过来转是 WideCharToMultiByte
所以一般来说,直接使用Unicode编码编写应用程序,效率较高

7 一个ASCII到Unicode转换的函数封装
bool Ansi2Unicode(const char* pAnsi, wchar_t* &pUnicode)
{
    if (nullptr == pAnsi)
        return false;

    size_t szAnsi = MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, nullptr, 0);
    pUnicode = new wchar_t[szAnsi];
    if (szAnsi == MultiByteToWideChar(CP_ACP, 0, pAnsi, szAnsi, pUnicode, szAnsi))
        return true;

    return false;
}

8  printf里,"%s"是针对单字节编码的,如果要正确打印双字节编码的字符串需要用"%ws"

9  要得到单字节编码的字符串长度用strlen,要得到双字节编码的字符串长度用lstrlen或wcslen
    char *szDemo = "abcdef";
    wchar_t *wszDemo = L"opqrstuvw";
    printf("%d %d %d\n", strlen(szDemo), wcslen(wszDemo), lstrlen(wszDemo));
输出结果 6  9  9
   类似的还有wcscat,wcscpy等

10 将MFC里的CString转换为Unicode字符数组
    CString strText = L"要转换的字符串";  //或者GetDlgItemText(ID, strText);
    wchar_t sztmp[1024] = {0};
    wsprintf(sztmp, L"%s", strText);

11 Unicode编码和ASCII码的区别不止应用于PC软件上,有字符串使用的地方就会有它们的“江湖”,例如在一些嵌入式文件系统中(如FAT),其文件操作的API,也同样要求字符串是Unicode型的


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值