Visual Studio里的ASCII编码和unicode编码

来源:互联网 发布:erp软件实施顾问 编辑:程序博客网 时间:2024/05/29 04:44
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
FindWindowFindWindowA函数会判断传入的字符串编码类型,如果需要会先进行了字符转换,再调用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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 爸爸对妈妈家暴怎么办 逆反心强23岁怎么办 觉得自己心理有问题怎么办 小孩心理脆弱过于敏感怎么办? 父母老是骂打我怎么办 爸妈打架闹离婚怎么办 夫妻离婚后孩子户口怎么办 离婚后孩子户口怎么办落户 50岁父母要离婚怎么办 父母离婚小孩没有出生证该怎么办 离婚。父母一直在劝说该怎么办 老婆跟人跑了怎么办啊 父母50了要离婚怎么办 父母吵架了我该怎么办 父母看孩子总是吵架怎么办 20岁父母离婚我怎么办 碰到没素质的人怎么办 父母抛弃了我该怎么办 父母说家里没钱困难怎么办 遇到素质低的老婆怎么办 孩子考试心里素质差怎么办 5岁儿童脾气不好怎么办 有一个素质差的父母怎么办 孩子对什么都无所谓怎么办 孩子在学习上无所谓怎么办 孩子对学习无所谓的态度怎么办 孩子不上进什么都无所谓怎么办 倔强的学生不理老师怎么办 一岁宝宝特别犟怎么办 孩子遇到问题喜欢发脾气怎么办 企业培养新人跑了怎么办 二年级学生读不懂题目怎么办 6岁宝宝有鼻炎怎么办 外地儿童怎么办北京医保卡 江苏联宝投资的钱怎么办 银行叫开了证券怎么办 中班心理健康我不开心了怎么办 大学生心理健康课总是抢不到怎么办 孩子成绩提不上去怎么办 孩子数学不开窍怎么办 二年级 初中孩子语文不开窍怎么办