大家好,又见面了,我是你们的朋友全栈君。
1.Unicode字符集
原本标准字符集为8位的ASCII码,但世界上的书写语言不能简单地用256个8位代码即一字节表示,就试更宽的值,例如16位值。这就是Unicode非常简单的原理。与混乱的256字符代码映射,以及含有一些单字节代码和一些双字节代码的双字节字符集不同,Unicode是统一的16位系统,这样就允许表示65536个字符。在这里会高兴地告诉你前128个Unicode字符(16位代码从0x0000到0x007F)是ASCII码,而接下来的128个Unicode字符(代码从0X0080到0X00FF)是ISO 8859-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的封装。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/213277.html原文链接:https://javaforall.cn