Visual Studio中C++关于Unicode字符集和多字节字符集
2017-08-20 16:29
686 查看
1.Unicode字符集
原本标准字符集为8位的ASCII码,但世界上的书写语言不能简单地用256个8位代码即一字节表示,就试更宽的值,例如16位值。这就是Unicode非常简单的原理。与混乱的256字符代码映射,以及含有一些单字节代码和一些双字节代码的双字节字符集不同,Unicode是统一的16位系统,这样就允许表示65536个字符。在这里会高兴地告诉你前128个Unicode字符(16位代码从0x0000到0x007F)是ASCII码,而接下来的128个Unicode字符(代码从0X0080到0X00FF)是ISO8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。
Unicode对表示所有字符及世界上使用象形文字的语言,包括一些列的数字、符号和货比的集合来说用16位来表示是充裕的,因此Unicode包含了世界上所有的字母、符号、数字以及中文等在内的字符。
Unicode有缺点吗?当然有。Unicode字符使用固定的16位存储,其字符串占用的内存是ASCII字符串的两倍,因为本地程序及文件常需要压缩存储。
宽字符不需要Unicode,Unicode是一种可能的宽字符编码。
2.多字节字符集
由于有些符号用8位即一个字节就可以表示,若使用Unicode字符集用16位表示,会造成内存空间浪费。因此提出多字节字符集 (MBCS),字符的宽度可以是一个字节,也可是两个字节或多个字节。这些多字节字符集按单字节值对待,其中一些字符改变了后续字符的含义。如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。3.两种字符集对比
VC6的设置:多字节。VS的默认设置:Unicode,在属性中可以改成多字节。
多字节编码:char,string,CStringA。
Unicode编码:wchar_t,wstring,CStringW。//带W的为Unicode字符集 因为Unicode是宽字节字符集用W表示
注意:如果项目是Unicode,那么CString就被定义为CStringW,否则就是CStringA。
附:
LPSTR = char*;LPCSTR = const char*;
LPWSTR = wchar_t*;LPCWSTR = const wchar_t*;
至于LPCTSTR也是根据项目字符集来定义为LPCWSTR(Unicode)或LPCSTR(多字节)。
OK,上面的定义很明显了,注意用的时候别弄混了,我觉得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字节版本也是把多字节转成unicode再去调用unicode版api),我不太喜欢CString。
接下来就是转换:www.2cto.com
// C++
char* 到 string:string str("char"); 或者string str = "char";
string 到 char*:const char* ch = str.c_str();
wchar_t* 和 wstring与上相同。
// MFC
char* 到 CStringA:CStringA str("char");
CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反对使用GetBuffer,因为使用这个,必须要ReleaseBuffer,而且很多时候没必要去分配空间)
wchar_t* 和 CStringW与上相同。
// 字符集之间转换
char* 到 wchar_t*:CA2W a2w("char"); const wchar_t* wch = a2w.operator LPCWSTR();
wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR(); (注意:反对使用_T("chs")这种方式,程序字符集在一开始就该确定,而且最好选择Unicode)
关于CA2W和CW2A这两个类,可以在atlconv.h中找到源代码,其实就是对WideCharToMultiByte和MultiByteToWideChar的封装。
相关文章推荐
- 再探C++Primer (3)关于unicode和多字节字符集
- 关于VC多字节字符集和unicode宽字符集的使用和问题,只有明白了其中的原理,才能灵活解决问题
- 关于VC多字节字符集和unicode宽字符集的使用和问题,只有明白了其中的原理,才能灵活解决问题
- 关于Visual Studio 2013 编译多字节字符集的解决方法
- CEF3自研究笔记 四、CEF3关于多字节字符集和UNICODE字符集
- Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识
- UNICODE与多字节字符集等字符问题
- vc中,unicode项目向多字节字符集项目移植
- 关于C/C++的字节对齐
- VC++中多字节字符集和Unicode之间的互换
- 关于C/C++的字节对齐
- Unicode字符集和多字节字符集关系
- c++字符集之间转换(UTF-8,UNICODE,Gb2312)
- CString 转换为 char* (VC6.0与Visual Studio 2005兼容问题)UNICODE字符集
- 关于Unicode字符集
- 关于Visual Studio中C++选项/MT和/MD的配置
- 关于 编码格式 字符集 的理解(什么是Unicode什么是UTF-8)
- Unicode字符集和多字节字符集
- Unicode字符集和多字节字符集关系