Visual Studio里的ASCII编码和unicode编码
来源:互联网 发布:erp软件实施顾问 编辑:程序博客网 时间:2024/05/29 04:44
1 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字符串
5 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 0
- Visual Studio里的ASCII编码和unicode编码
- ASCII编码 和 UNICODE编码
- ASCII编码和Unicode编码
- ASCII和Unicode编码
- ASCII和Unicode编码详解
- ASCII和unicode编码区别
- ASCII编码和UNICODE、utf-8编码
- ASCII编码和UNICODE编码转换
- 字符编码中ASCII、Unicode和UTF-8的区别
- ASCII和unicode两种编码的区别
- 字符编码(ASCII、Unicode和UTF-8的关系)
- 字符编码 ASCII,Unicode和UTF-8的关系
- ASCII,Unicode和UTF-8编码的区别与联系
- ASCII、Unicode和UTF-8编码的区别
- 字符编码中ASCII、Unicode和UTF-8的区别
- 字符编码的变迁 ASCII, Unicode和UTF-8
- ASCII、Unicode和UTF-8编码的区别
- 字符编码 ASCII,Unicode和UTF-8的关系
- ID3决策树算法
- zzulioj1895: 985的0-1串难题(思维)
- n个人围成一圈,从第1个人开始数数,数到3的人出圈,输出最后剩余的人编号(约瑟夫环问题)
- HACM 1170 Balloon Comes!
- Qt通过QToolTip显示浮动信息
- Visual Studio里的ASCII编码和unicode编码
- MeasureSpec的三种模式的意思
- 【python】杂笔记
- 字符串匹配之KMP算法
- TOJ 1473.Moving Tables
- Android 使用View Animation实现动画加载界面
- javascript变量声明提升(hoisting)
- JAVAWEB Dao模式之增删改和查询通用方法
- Treap模板(支持Merge/Split)