ANSI与Unicode的转换unicode编码转换二进制
最近遇到中⽂路径访问的问题,⼜重新学习了⼀遍ansi与Unicode的知识,博⽂记录下来以供后续参考。
ANSI 编码
ANSI是⼀种字符代码,为使计算机⽀持更多语⾔,通常使⽤0x80~0xFF 范围的2 个字节来表⽰1 个字符。不同的国家和地区制定了不同的标准,由此产⽣了GB2312、GBK、GB18030、Big5、Shift_JIS 等各⾃的编码标准。这些使⽤多个字节来代表⼀个字符的各种汉字延伸编码⽅式,称为ANSI 编码。
关于MBCS字符集(Multi Byte Character System):GB2312、GBK等编码被称为MBCS,MBCS同ASCII是完全兼容的。对于前ASCII的128个字符,在MBCS字符集下有完全相同的编码,⽽汉字等字符⽤多个字节存储。也意味着MBCS下,字符的长度有可能有1个字节的,也有多个字节的。
所以ANSI编码其实是⼀个统称,不同的语⾔使⽤不同的编码规范,并没有跨语⾔统⼀编码。⽐如 windows7 notepad记事本保存的时候,在弹出对话框的下⽅有“编码”下拉框,默认是“ANSI”,也可以选择“Unicode”(其实是UTF-16)和 “UTF-8”。如果选择了ANSI,那么实际使⽤的编码规范就跟你的操作系统版本强相关了,如果是简体中⽂的windows就会⽤GBK标准。
Unicode编码
就是把地球上所有的语⾔的符号,都⽤统⼀的字符集来表⽰,⼀个编码真正做到了唯⼀。Unicode只是确定了字符的⼆进制编码,但并没有确定字符存储的具体实现⽅式。⽐如UTF-8 ,UTF16是常见的Unicode实现⽅式。
UTF-8编码是变长的,⼀个字符可能是1个字节,2个字节,3个字节或者4个字节长。⼀般来说,欧洲的字母字符长度为1到2个字节,⽽亚洲的⼤部分字符则是3个字节,附加字符为4个字节长。Unix平台中普遍⽀持UTF-8字符集,HTML和⼤多数浏览器也⽀持UTF-8。
UTF-16编码的字符,要么是2个字节,要么是4个字节表⽰的。windows2000以上版本使⽤UTF-16,⽼版本windows⽤的ANSI。
VC下的格式转换
ANSI字符串转Unicode(windows下对应UTF-16编码)
在vc⼯程选择unicode编译的情况下,如果是字符串常量可以直接使⽤L和_T or _TEXT宏,也可以使⽤wsprintf函数进⾏转换(需要引⽤Windows.h)。
TCHAR szW[100];
//all strings are Unicode
swprintf(szW,L"%s",L"Unicode Str中⽂");
CString name = _T("");
//ANSI to Unicode,wsprintf可以直接⽤,使⽤⼤写的%S
//注意swprintf函数是不⾏的,据说要先加setlocale(LC_CTYPE, "chs")语句
wsprintfW(szW,L"%S","Unicode Str中⽂");
如果是字符串变量,使⽤ATL 提供的字符转换宏会⽐较⽅便,也可以使⽤wsprintf函数。
char buff[512];
//获取⼯作⽬录的路径,ANSI编码,路径中的中⽂字符占⽤2个字节
std::string s_currPath = _getcwd(buff,512);
TCHAR szW[512];
USES_CONVERSION;
/
/注意使⽤A2W宏,不可直接调⽤swprintf_s(szW,512,L"%S",...)
swprintf_s(szW,512,L"%s",A2W(s_currPath.c_str()));
//wsprintf可以直接使⽤
wsprintfW(szW,L"%S",s_currPath.c_str());
Unicode转ANSI
和上⾯类似,使⽤ATL的宏W2A即可。或者使⽤wsprintfA(sA, "%S", L"中⽂"),其中sA是char数组。
另外,转换还可以使⽤功能更强⼤的WideCharToMultiByte函数和MultiByteToWideChar函数。
C++11与Unicode
C++11对Unicode提供了语⾔级别和库级别的⽀持,可以进⾏Unicode下不同编码⽅式的转换,我也没玩过,可以参考这篇blog:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。