ANSI与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("Report.txt");  
      
    //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:

http://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/

时间: 2024-08-10 22:53:29

ANSI与Unicode的转换的相关文章

Ansi 与 Unicode 字符串类型的互相转换

WideCharToMultiByte 实现宽字节转换到窄字节MultiByteToWideChar 实现窄字节转换到宽字节 WideCharToMultiByte 的代码页用来标记与新转换的字符串相关的代码页:MultiByteToWideChar 的代码页用来标记与一个多字节字符串相关的代码页, [1].常用的代码页有 CP_ACP 和 CP_UTF8 两个: 使用 CP_ACP 代码页就实现了 ANSI 与 Unicode 之间的转换:--- 我们所用的!使用 CP_UTF8 代码页就实现

关于ASCII、GB231、GBK、UTF-8/UTF8、ANSI、unicode的学习笔记

继续上次的学习内容,写一些自己学习的笔记吧!总是觉得没有笔记的学习总是不那么踏实,我承认自己是个记忆力很差的人,特别羡慕那些可以把自己学过的东西记得很牢靠的人.哎!可惜我不是,那只能做出来点东西,就算以后忘了,回过头来可以看一看,有东西查:毕竟是自己亲手打出来的一个一个字啊 已经一万六千字了!嘿嘿...继续加油! 今天公司网络有问题,说是让在家里上班,skype在线就行了.结果我这自觉性不够,就打酱油了!还是继续学习我的mysql吧!我是刚毕业的大学生,学的和写的都是一些最基础的,如果巧遇大牛,

多字符集(ANSI)和UNICODE及字符串处理方式准则

在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行: 基本准则: 1.将文本字符串想象为字符数组,而非char或字节数组 2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR) 原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): [cpp] view plain

ANSI和UNICODE编程的注意事项

建立UNICODE编码工程 在VC60下,默认方式下建立的是ANSI编码的工程(注:编译的exe内部,其资源字符是以UNICODE保存),建立UNICODE编码工程的方法: 1.为工程添加UNICODE和_UNICODE预处理选项.   具体步骤:打开[工程]->[设置-]对话框,在C/C++标签对话框的"预处理程序定义"中去除_MBCS,加上_UNICODE,UNICODE.(注意中间用逗号隔开). 在没有定义UNICODE和_UNICODE前,所有函数和类型都默认使用ANSI

关于ANSI 和 Unicode

关于ANSI和Unicode 1.ANSI American National Standards Institute(美国国家标准学会),ANSI编码不是一种具体的编码方式,而是一种指定在某些环境下使用某些编码方式的标准. 1.1 ASCII码 English环境下,ANSI编码标准为ASCII:ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001).这128个符号(包括32个不能打印出来的控制符

ANSI与Unicode编码,TCHAR | LPSTR | LPCSTR | LPWSTR | LPCWSTR | LPTSTR | LPCTSTR 的含义

一个字符可以用1-byte表示,即ANSI编码: 一个字符也可用2-bytes表示,即Unicode编码(Unicode其实还包含了更多内容,不止2-bytes). Visual C++支持char和wchar_t作为ANSI和Unicode的原始数据类型. 例如 char cResponse; // 'Y' or 'N' char sUsername[64]; // str* functions 以及 wchar_t cResponse; // 'Y' or 'N' wchar_t sUser

ASCII、ANSI、Unicode编码

3.1 ASCII编码 以下来自"维基百科": ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言.它是现今最通用的单字节编码系统(但是有被UniCode追上的迹象),并等同于国际标准ISO/IEC 646. ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今

DLL中导出ANSI和UNICODE函数

模仿window中的DLL导出ANSI和UNICODE版本的函数,使用UNICODE宏来控制使用哪个版本: 在函数实际的执行代码UNICODE版本中,在ANSI函数的版本中只做参数的转换,及ANSI字符串转UNICODE字符串,然后调用UNICODE版本的函数.  0.DLL头文件 #include <Windows.h> #ifndef _ICAL_H_ #define _ICAL_H_ #ifdef DLL_EXPORT_IMP #define DLL_EXPORT extern &quo

字符编码的故事(ASCII,ANSI,Unicode,Utf-8区别)转载

http://www.imkevinyang.com/2009/02/字符编解码的故事(ascii,ansi,unicode,utf-8区别).html 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机"