在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。
在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号例如制表符。
后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII 127,他们使用大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与Leading Byte一起作为实际的编码。这样的字符集有很多,我们常见的GB-2312就是其中之一。
例如在GB-2312字符集中,“连通”的编码为C1 AC CD A8,其中C1和CD就是Leading Byte。前127个编码为标准ASCII保留,例如“0”的编码是30H(30H表示十六进制的30)。软件在读取时,如果看到30H,知道它小于128就是标准ASCII,表示“0”,看到C1大于128就知道它后面有一个另外的编码,因此C1 AC一同构成一个整个的编码,在GB-2312字符集中表示“连”。
由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。注意UTF-8是编码,它属于Unicode字符集。Unicode字符集有多种编码形式,而ASCII只有一种,大多数MBCS(包括GB-2312)也只有一种。Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。
例如“连通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90
而其UTF-8编码为:E8 BF 9E E9 80 9A
最后,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件有三种途径来决定文本的字符集和编码:
最标准的途径是检测文本最开头的几个字节,如下表:
开头字节 Charset/encoding
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.例如插入标记后,连通”两个字的UTF-16 (big endian)和UTF-8码分别为:
FF FE DE 8F 1A 90
EF BB BF E8 BF 9E E9 80 9A
但是MBCS文本没有这些位于开头的字符集标记,更不幸的是,一些早期的和一些设计不良的软件在保存Unicode文本时不插入这些位于开头的字符集标记。因此,软件不能依赖于这种途径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户,例如将那个“连通”文件拖到MS Word中,Word就会弹出一个对话框。
如果软件不想麻烦用户,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能属于哪个charset,这就很可能不准了。使用记事本打开那个“连通”文件就属于这种情况。
我们可以证明这一点:在记事本中键入“连通”后,选择“Save As”,会看到最后一个下拉框中显示有“ANSI”,这时保存。当再当打开“连通”文件出现乱码后,再点击“File”->“Save As”,会看到最后一个下拉框中显示有“UTF-8”,这说明记事本认为当前打开的这个文本是一个UTF-8编码的文本。而我们刚才保存时是用ANSI字符集保存的。这说明,记事本猜测了“连通”文件的字符集,认为它更像一个UTF-8编码文本。这是因为“连通”两个字的GB-2312编码看起来更像UTF-8编码导致的,这是一个巧合,不是所有文字都这样。可以使用记事本的打开功能,在打开“连通”文件时在最后一个下拉框中选择ANSI,就能正常显示了。反过来,如果之前保存时保存为UTF-8编码,则直接打开也不会出现问题。
如果将“连通”文件放入MS Word中,Word也会认为它是一个UTF-8编码的文件,但它不能确定,因此会弹出一个对话框询问用户,这时选择“简体中文(GB2312)”,就能正常打开了。记事本在这一点上做得比较简化罢了,这与这个程序的定位是一致的。
需要提醒大家的是,部分Windows 2000字型无法显示所有的Unicode字符。如果发现文件中缺少了某些字符,只需将其变更为其它字型即可。
big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
Unicode big endian:在Big-endian处理器(如苹果Macintosh电脑)上建立的Unicode文件中的文字位元组(存放单位)排列顺序,与在Intel处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择Unicode big-endian格式。
分享到:
相关推荐
Unicode 字符集和多字节字符集关系 Unicode 字符集是为了整合全世界的所有语言文字而诞生的,任何文字在 Unicode 中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。 Unicode ...
unicode 字符集 与 多字节字符集转换/kekegeneral
首先,我们要理解Unicode和多字节字符集的区别。Unicode是一种国际标准,它定义了一种包含世界上几乎所有字符的编码方案,旨在解决不同语言字符集之间的兼容性问题。而多字节字符集,如GBK、GB2312等,是针对特定...
然而,多字节字符集可能在处理非本地字符时产生问题,因为不同的多字节编码之间可能存在不兼容性。 本项目中的"StringConvert"可能包含以下关键接口: 1. `UTF8ToMultiByte`: 这个函数将UTF-8编码的字符串转换为...
随着Unicode字符集的不断扩大,UCS-2已经不足以覆盖所有字符,因此引入了更高级的编码方式——UTF-16。UTF-16仍然使用16位的基本单位,但对于超出基本多文种平面(Basic Multilingual Plane,BMP)的字符,则使用更...
当我们提到“unicode字符集下编写多字节的串口调试助手”时,这涉及到字符编码的处理,尤其是Unicode和多字节编码间的转换。 Unicode是一种国际标准,用于表示世界上几乎所有的文字和符号,确保不同语言的字符可以...
### Unicode汉字字符集...通过了解这些基础概念和技术细节,我们可以更好地理解和应用Unicode汉字字符集,从而有效地处理中文文本和其他多语言数据。这对于软件开发、数据库管理、自然语言处理等领域都有着重要的意义。
总之,Unicode字符集是现代信息技术中不可或缺的一部分,它为全球化的信息交流提供了坚实的基础,确保了文本数据的准确性和一致性。随着Unicode标准的持续发展,未来将能够涵盖更多语言和文化的字符,进一步推动全球...
多字节字符集(Multi-byte Character Set, MBCS)是使用一个或多个字节来表示一个字符的集合。这包括双字节字符集和其他更复杂的字符编码方案,例如一些特殊的东亚字符集可能需要超过两个字节来表示单个字符。 **2....
ISO8859是国际标准化组织定义的一系列单字节字符集,分为多个部分,如ISO8859-1(拉丁文1)等,它们主要覆盖了西欧语言。这些字符集的优点在于它们只需要一个字节来表示字符,但在处理非西欧语言或特殊符号时,其...
VS2013 编译MFC 使用多字节字符集时报错 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. 安装补丁解决。
Unicode字符集是一种编码标准,旨在统一全球各种语言的文字表示,以解决不同地区和语言之间的文本数据交换问题。在软件开发中,尤其是涉及到多语言支持时,Unicode是至关重要的。宽字节字符集(如DBCS,Double Byte ...
Oracle支持多种字符集,包括单字节字符集(SBCS)、多字节字符集(MBSCS)以及Unicode字符集等。 - **单字节字符集(Single Byte Character Set, SBCS)**:每个字符由一个字节表示。 - **多字节字符集(Multi Byte ...
在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2008环境下运行时会报...
它需要源Unicode字符串、编码页(决定多字节字符集)、转换选项以及其他参数,然后返回转换后的多字节字符串。 2. `MultiByteToWideChar`:与`WideCharToMultiByte`相反,此函数将多字节字符串转换为Unicode字符串...
综上所述,Unicode字符集转换是计算机处理多语言文本时的关键技术,理解和掌握其原理及实践方法,对于开发者来说至关重要。无论是软件开发、数据交换还是国际化应用,Unicode的使用都能带来极大的便利性和兼容性。
字符集分为单字节和多字节编码。单字节编码,如 US7ASCII,可以表示128个字符,而8位单字节编码如WE8ISO8859P1可表示256个字符,适用于西欧语言。多字节编码又分为变长和定长两种,前者如AL32UTF8,用于支持亚洲语言...
2. 转换方法:类中可能会有`ConvertToWide`和`ConvertToMultiByte`这样的方法,分别对应于`WideCharToChar`和`CharToWideChar`的功能,用于在宽字符和多字节字符间进行转换。 3. 错误处理:为了确保转换过程的健壮性...
1. **多字节字符集(MBCS)**:多字节字符集是指非固定长度的字符编码,例如Windows中的CP_ACP(ANSI代码页)。它可以根据不同的语言环境使用不同数量的字节来表示一个字符。 2. **UTF-8**:UTF-8是一种可变长度的...
为了解决这个问题,出现了多种不同的代码页(code pages),每种代码页都有自己的编码规则,尤其在亚洲,由于语言的复杂性,出现了如DBCS(双字节字符集)这样的系统,其中某些字符需要1个字节,而其他字符需要2个...