`
javasee
  • 浏览: 916792 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ANSI、MBCS与UNICODE

阅读更多

目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。ASCII码适用于所有拉丁文字,它用7位二进制数进行编码(其最高位(bit7)被用做奇偶校验位),可以表示128个字符。

第0~32号及第127号(共34个)是控制字符或通信专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等。

第33~126号(共94个)是字符,其中第48~57号为0~9 10个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

ASCII码占用一个字节,准确地说,是7个比特。由于汉字出现在ASCII码之后,所以汉字的编码必须兼容ASCII码。还有一个问题就是,汉字的数目很多,用简单的1个字节根本无法表达(1个字节,撑死了只能表示256个字符,除掉ASCII码,只有128个可用的了)。因此聪明的中国人决定采用2个字节来表达一个汉字。由于ASCII码占用7位的历史原因,所以这种聪明的编码方式规定:对于连续的2个字节,只有在2个字节的bit7都是1的情况下,才认为这2个字节合起来表示一个汉字。这样不同长度混排的编码方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字节字符集)",如"中文ABC"这串文本,它所占用的字节数可能就是:2×2+3=7,如图4-12所示。

图4-12 MBCS下中文与字
母的存储长度

这样的编码挺好,而且与ASCII码兼容。这种编码被称做GB2312(国标2312,GB就是国标的简写)。GB2312后来又扩展成了GBK(国标扩展码),甚至GB18030。此外,不同的国家和地区都制定了不同的编码标准,如:BIG5、JIS等编码。不同编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字存储在同一段编码的文本中,UNICODE由此浮出水面。

为了使国际间信息交流更加方便,国际标准化组织(ISO)制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

UNICODE开始制订时,计算机的存储器容量极大地发展了,也就是说空间再也不成为问题了。于是ISO直接规定必须用2个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些"半角"字符,UNICODE保持其原编码不变,只是将其长度由原来的8位扩展为16位,如英文字母"A",其编码就会变成"00000000 01100001"。很显然,由于"半角"英文符号只需要用到低8位,所以其高8位永远是0。因此这种大气的方案在保存纯英文文本时会浪费一倍的空间。而其他文化和语言的字符则全部重新统一编码。如:"中"的UNICODE为"01001110 00101101"。

这样一来,没那么多的麻烦事了,所有的字符都固定占用2个字节。如"中文ABC",它所占用的字节数就是:5×2=10,如图4-13所示。所以,使用UNICODE编码进行存放的字符也被称做宽字节字符。

图4-13 UNICODE下中文与字母的存储长度
在标准C++中,可以这样定义一个MBCS或者ANSI的字符串,即:
  1. charmsg[]="学习C++";

定义一个UNICODE的字符串,可以用L前缀,即:

  1. wchar_tmsg[]=L"学习C++";

UNICODE统一了天下,但是客观事实是,所有的应用程序(包括航空公司的订单系统)不会一夜之间换用UNICODE编码,所以程序员面对的新问题是:如何编写自适应编码的程序?如何完成各种编码之间的转换?

===============================

以上摘自《把脉VC++》第4.5.2小节的内容,转载请注明出处。

如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533

分享到:
评论

相关推荐

    升级VC6源码mbcs转unicode

    升级VC6源码到VC2002等高版本,自动添加TEXT(),自动将strcpy等字符串函数改为_tcscpy等函数,使代码适应于UNICODE和MBCS版本。

    二维条码动态链接库在MBCS和UNICODE模式的自动切换调用

    采用VC++动态调用方式实现MBCS和UNICODE的两种动态库之间的自动切换调用。 首先,申明预定义MBCS和UNICODE模式要调用动态库文件名 然后,采用LoadLibrary( szRunDllPath ); 进行动太库的装载 最后,进行接口申明 如...

    Unicode MBCS字符转换程序.rar

    1.实现Unicode16le Unicode16be utf-8 mbcs文件编码的转化 2.实现十六进制内容转换输出

    MBCS编码和UNICODE编码的相互转换.pdf

    。。。

    MBCS编码和UNICODE编码的相互转换.docx

    。。。

    最新unicode点阵字库生成工具(fontmaker)

    增加了一个字符串mbcs2unicode(内码转统一码)的功能。 (支持转:U16-LE, U16-BE, UTF8) V1.03 (20110705) 1. 修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) 2. 修改...

    Unicode下CString与char*之间的转换(vs2008绝对实用)

    在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多...这里总结了在VS2008环境中 Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

    utf8 宽字节 mbcs 随意转换

    utf8 宽字节 mbcs 随意转换 vtString WStringToUTF8(const wchar_t* wstring); vtString2 UTF8ToWString(const char *string_utf8); vtString WStringToMBCS(const wchar_t* wstring); vtString2 MBCSToWString...

    vs2008-Unicode字符集下CString与char_互转换

    在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多...这里总结了在VS2008环境中 Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

    Araxis Merge v6.5 NSIS文本对比.rar

    Araxis Merge 是一款专业的可视化文件比较以及合并和同步的软件,同时也是该软件目前最新的版本,新版带来了全新的功能以及优化,包括合并使您能够比较和处理不同版本的...它支持ASCII,MBCS和Unicode字符编码的文件。

    VC下Unicode编程文档.docx

    VC下Unicode编程文档 WideCharToMultiByte用来将Unicode字符串转化为MBCS的; MultiByteToWideChar用来将MBCS字符串转化为Unicode的;

    C++字符串完全指南.doc

    1.8. Win32 API中的MBCS 和 Unicode的二种字符集 9 1.9. String 和 TCHAR 类型定义 10 1.10. 何时使用TCHAR 和Unicode 11 第二部分 各种字符串类部分 12 2.1. 前言 12 2.2. C语言字符串与类型定义 12 2.3. COM中的...

    Araxis Merge Professional 2018(包含破解)

    它支持ASCII,MBCS和Unicode字符编码的文件。同时可以显示行内更改的详细要点。它可以配置为忽略空白和行结尾的差异,以及匹配指定正则表达式的行的更改,后者对忽略不重要的更改(如时间戳或扩展版本控制关键字)很...

    HugeCalc V6.1.0.1

    为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。...

    simpleini-master-版本202308

    它支持ASCII、MBCS和Unicode格式的数据文件。它被明确设计为可移植到任何平台,并已在Windows, WinCE和Linux上进行了测试。使用MIT许可证作为开源和免费发布. 功能概述 MIT许可允许在所有软件中免费使用(包括GPL...

    Visual C++.NET中的字符串转换方法.doc

    Visual C++.net涉及到ATL/ATL Server、MFC和托管C++...之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。  那么什么是BSTR、LPSTR以及LPWSTR呢?

    HugeCalc 7.0.10

    HugeCalc 是一款高精度算法库(同时支持 MBCS + UNICODE 版),适合于大规模科学计算,尤其适用于数论、密码学等领域研究,其核心算法耗费作者十余年的心血

    HugeCalc 超大整数完全精度快速计算器/算法库 V7.0.1.0

    为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。...

    INI配置文件操作库SimpleIni.zip

    SimpleIni 是一个跨平台的 C 库,提供一个简单的API用于操作 ini 配置文件。支持ANSII,MBCS以及Unicode编码.在Windows WinCE和Linux上通过测试.支持多行值和多个同名健. 标签:SimpleIni

    HugeCalc 超大整数完全精度快速计算器/算法库 V7.0.0.0

    为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。 <br> V6...

Global site tag (gtag.js) - Google Analytics