刚刚看了《汉化教学文集2006》中的几篇文章,谈到了字符编码问题。终于明白了ASCII,Unicode,Unicode big endian,UTF-8的关系。
ASCII:学过计算机基础的都知道,8bits的英文编码。实际只用低7位,127个字符,32(0x20)为空格,之前是控制字符,之后是有效字符。当>128时,需要使用代码页(code page)来确定表示的字符。在保存文件时一般ANSI项就是指它。
Unicode:使用两个字节对全球字符进行统一编码,有65536个编码。学名“UCS”——“Universal Multiple-Octet Coded Character Set”.UCS-2为两字节版本,UCS-4为四字节版本,目前两个版本内容是一样的(字符数还没超过2个字节能表示的范围)。
Unicode little endian:将Unicode中表示同一个字符的两个字节顺序返过来。主要目的是为了适应CPU处理字符的方式,加快处理速度。在Windows上为Unicode的默认存储方式(记事本保存对话框中的那个“Unicode”就是这个)。
Unicode big endian:Unicode字符编码以正序存储。非默认。
引用一段原文:
// “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 //
应该可以说明问题。
UTF-8:Unicode的一种传输及存储方式,主要是为了消除编码中那些0x0000的字节和减少存储英文时所占用的空间。
以下是Unicode(UCS-4)和UTF-8之间的转换关系表:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。
BMP:Basic Multilingual Plane,UCS-4中0x0000----这些字符。
引用一下原文:
// UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:
UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。
UCS-4根据最高位为0的最高字节(引注:即第一个字节)分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。
group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。 //
BOM:Byte Order Mark,字节序,用以区分Unicode little endian与Unicode big endian。即使用名为"ZERO WIDTH NO-BREAK SPACE"的字符“0xFEFF”传输及存储时首先处理该字符。若读到FEFF,就表明这个字节流是Big-Endian的;而如果是FFFE,就表明这个字节流是Little-Endian的。
以下为引用:
// UTF-8不需要它来表明字节顺序,但但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 //
Windows就是使用BOM来标记文本文件的编码方式的。
区位码与GB2312之间的关系:
引用原文:
// 再说区位码,啊的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。为了兼容00-7f的ASCII编码,我们在区位码的高、低字节上分别加上A0。这样“啊”的编码就成为B0A1。我们将加过两个A0的编码也称为GB2312编码,虽然GB2312的原文根本没提到这一点。 //
[原文来源 :http://www.loboog.com/article.asp?id=11]
[本文遵循创作共用协议,转载请注明出处 :然而不已]
分享到:
相关推荐
本文将深入探讨PHP中的字符编码转换,特别是针对ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-8+BOM的转换。 首先,让我们了解这些编码格式的含义: 1. ANSI编码:通常指的是Windows系统的默认...
本篇文章将深入探讨标题中提及的几种字符编码:Text、ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-7,并介绍它们之间的转换。 1. **Text编码**: 在Windows系统中,通常所说的"Text"编码是指...
UTF-8则是一种多字节的Unicode编码,可以表示世界上几乎所有的字符,包括中文、英文、日文等,其优点在于对ASCII字符(如英文)只用单字节表示,兼容性更强。 在C语言中,由于没有内置的GBK或UTF-8转换函数,我们...
UTF-8编码的每个字符由连续的一组字节表示,而GBK编码则是一个字节对(big-endian或者little-endian)表示一个字符。转换过程主要包括识别UTF-8的字节序列并根据GBK的规则重新组合字节。 在`Utf8ToGbk.c`中,可能...
UTF-8、UTF-16和UTF-32是Unicode字符集的三种不同编码形式,每种都有其独特的特性和用途。这篇文档将深入讲解这些编码方式,并介绍如何在C语言中进行它们之间的转换。 1. **UTF-8编码** UTF-8是最广泛使用的...
描述中提到的“ANSI、Unicode、UniBigEnd、UTF-8、UTF-7”都是常见的字符编码格式: 1. **ANSI**:通常指的是Windows默认的代码页,如Code Page 1252,它主要用于英文环境,但对非ASCII字符的支持有限。 2. **...
UTF-16BE,全称为Unicode Transformation Format - 16 Bit Big Endian,是一种Unicode字符集的编码方式,主要用于处理大量的Unicode字符。在UTF-16BE编码中,每个Unicode字符通常由两个或四个字节表示,其中"Big ...
**UTF-16BE**是一种字符编码方式,其中**BE**代表**Big Endian**(大端模式)。该文件名为**UTF-16BE_FIXED.txt**,表明这是一个采用UTF-16BE编码格式的文本文件。 #### 描述:“字符编码文件,UTF16BE编码,和GBK_...
本篇文章将深入探讨“自动识别不同编码的文本文件”的关键知识点,包括ASCII、UTF-8、Unicode 16 Little Endian和Big Endian四种格式。 首先,ASCII(美国标准信息交换代码)是一种基于拉丁字母的7位编码系统,它...
UTF-8则是目前最常用的Unicode编码,它使用1到4个字节表示一个字符,对ASCII字符的编码与ASCII相同,因此与许多系统和软件兼容。UTF-8的优点在于其向前兼容性和空间效率,尤其是对于主要使用ASCII字符的文本。 GBK...
这个工具允许用户将编辑的文本中的各种符号和字符转换成Unicode编码,以UTF-16LE、UTF-16BE和UTF-8三种不同的格式输出。在处理跨语言或特殊字符时,这样的工具尤其有用,因为Unicode是一种通用的字符编码标准,包含...
理解Unicode及其各种实现方式,如UTF-8、UTF-16,以及与早期的中文编码如GB2312、GBK的关系,有助于程序员在开发过程中避免字符处理的问题,提高代码的兼容性和可读性。通过深入探讨这些知识点,程序员可以更好地...
- **UTF-8 (Unicode Transformation Format - 8 bits)**:这是Unicode的一种变长编码格式,适合网络传输和存储,能够很好地向后兼容ASCII编码。 - **UTF-16**:这是一种变长编码格式,主要用于Windows等操作系统内部...
UTF-8的优点在于它对ASCII字符的编码与ASCII自身相同,且在Web上具有良好的兼容性。 UTF-16则是使用2个或4个字节编码Unicode字符,对于UCS-2兼容的字符,它与UCS-2编码一致。UTF-16LE(Little Endian)和UTF-16BE...
UTF-8与ASCII兼容,如果字符编码值在0到127之间,UTF-8编码与ASCII编码完全相同。 2. UTF-8与Unicode的编码关系: - Unicode字符编码通常使用UCS-2或UCS-4格式,而UTF-8是一种将UCS编码的字符转换为字节序列的方法...
它与ASCII兼容,对于码位在0至127之间的字符,UTF-8的编码与ASCII相同,这使得UTF-8成为了Web开发中最常用的编码方式之一。 - **UTF-16**是另一种可变长度的编码方案,使用2或4个字节来表示一个Unicode字符。它...
UTF-8的优点在于它保持了ASCII兼容性,前128个Unicode字符(基本拉丁字母、数字和一些符号)与ASCII相同,只用一个字节表示。这使得UTF-8成为了互联网上最广泛使用的编码。 现在,让我们谈谈如何计算不同编码下的...
UTF-8是最常见的,它使用1到4个字节来表示一个字符,对ASCII字符使用1个字节,其他Unicode字符使用2到4个字节。UTF-16则通常使用2个字节,但也可以使用4个字节来表示Unicode字符集中的所有字符。UTF-16的字节顺序有...