`
jiang5495
  • 浏览: 92965 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

字符集常识(转载)

阅读更多
13.2.1  计算机表示字符的方式与字符集
众所周知,计算机是工作在二进制基础上的。也就是说从本质上讲,计算机只认识数字,而不认识字符。因此,要计算机认识或表示字符就必须提供字符与数字的某种映射机制。这种映射就是通过所谓的字符集来完成的。

字符集是一组文本和图形符号,每个符号映射到一组非负整数。与字符集密切相关的概念是字符编码,字符编码是指字符集映射到特定宽度的一些单元,并定义字节序列化和排序的规则。

13.2.2  字符集的发展
字符集的发展经历了一个从ASCII到Unicode(UTF-8)的演变过程。ASCII是美国信息交换标准委员会(American Standards Committee for Information Interchange)的缩写。我们知道,电子计算机技术是从美国开始发展起来的,因为美国使用的文字为美国英语,美国规定的计算机信息交换用的字符编码集是人们熟知的ASCII码,它以8bit字节为单位存储,ASCII的0-31及127为控制符,32-126为可见字     符,包括所有的英文字母,阿拉伯数字和其他一些常见符号,128-255的ASCII码则没有定义。比如,Computer用ASCII表示就是如下一些数字:67、111、109、112、117、116、101和114。由于ASCII只用了7bit,而存储时使用的是8bit,因此,字节的最高为在计算机内部通常保持为0,在数据传输时,该位常用作奇偶校验位。

ASCII 由于其字符个数有限,常常难以满足实际应用中的需要。因此,国际化标准组织又建立了所谓的ASCII扩展字符集,这种字符集就是用ASCII字符最高位为 1的单元来表示那些扩展字符,也就是用十进制128-255来表示这些扩展字符。其中最常见的要数ISO-8859-1字符集。值得一提的是,因为考虑到程序中处理的信息大多是西文信息,因此有些Web容器(如Tomcat)在处理所接收到的request字符串时,如果您没有指定request的编码方式则系统就缺省地采用ISO-8859-1,明白这一点对理解本章后面的问题会有帮助。

相比西方的拼音文字,东方的文字(如像中文这样的象形文字)的字符数要大得多,根本无法在一个字节内将它们表示出来,因此,它们以两个字节为单位存储,以中文国标字符集GB2312为例,汉字区的内码范围是:高字节B0-F7,低字节A1-FE。可见,两个字节的最高位都为1。

系统可以据此判断,若第一个字节大于127,则把与该字节后紧接着的一个字节结合起来共两个字节组成一个中文字符。这种由多个字节存储一个字符的字符集叫多字节字符集(MultiByte Charsets),对应的像ASCII这种用一个字节存储一个字符的字符集叫单字节字符集(SingleByte Charsets)。在GB2312字符集中,ASCII字符仍然用一个字节存储,换句话说该ASCII是该字符集的子集。

GB2312 共收录了7445个字符,包括6763个汉字和682个其他符号。由于该字符集包含的汉字数太少,许多生僻一点的字都不包含在内,给实际应用带来了不便。以后又对它进行了扩展,这就有了我们现在广泛使用的GBK字符集,GBK是现阶段Windows及其他一些中文操作系统的缺省字符集。它包含2万多个字符,除了保持和GB2312兼容外,还包含繁体中文字,日文字符和韩文字符。值得注意的是GBK只是一个规范而不是国家标准,新的国家标准是 GB18030-2000,它是比GBK包含字符更多的字符集。

我国的台湾地区使用的文字是繁体字,其字符集是BIG5,而日本采用的字符集则是SJIS。它们的编码方法与GB2312类似,它们的ASCII字符部分是兼容的,但扩展部分的编码则是不兼容的,比如这几种字符集中都有“中文”这两个字符,但他们在各自的字符集中的编码并不相同,这就是用GB2312写成的网页用BIG5浏览时,看到的是乱糟糟的信息的原因。

可见,在字符集的世界里,呈现给我们的是一个群雄割据的局面,各字符集拥有一块自己的地盘。这给各国和各地区交换信息带来了很大的困难。比如,在早期的编程实践中,如何识别中文字符和扩展ASCII字符,如何统计字符数等看似简单的问题,处理起来是那样的棘手,再加上各种应用软件采用的处理方式也各不相同。在编程实践中,那种梦魇般的感觉可能会让很多处理过这类问题的老一些的程序员至今都挥之不去。同时,这些问题也给国际化(本地化)编程造成了很大的麻烦。

常言道:“分久必合”,如果说以前各应用程序采用的各自的一些技巧来处理字符集问题是扬汤止沸的话,那么,随着国际标准ISO10646定义的通用字符集(Universal Character Set即UCS)的出现则起到了釜底抽薪的作用,因为该字符集的出现使这种局面发生了彻底的改观。UCS 是所有其他字符集标准的一个超集。它保证与其他字符集是双向兼容的。就是说,如果你将任何文本字符串翻译到UCS格式,然后再翻译回原编码,你不会丢失任何信息。UCS包含了用于表达所有已知语言的字符。

ISO 10646定义了一个31位的字符集。然而,在这巨大的编码空间中,迄今为止只分配了前65534个码位(0x0000到0xFFFD)。这个UCS的16位子集称为基本多语言面(Basic Multilingual Plane,BMP)。被编码在16位BMP以外的字符都属于非常特殊的字符(比如象形文字),且只有专家在历史和科学领域里才会用到它们。

UCS 不仅给每个字符分配一个代码,而且赋予了一个正式的名字。表示一个UCS值的十六进制数,通常在前面加上“U+”,就像U+0041代表字符“拉丁大写字母A”。UCS字符U+0000到U+007F与US-ASCII(ISO 646)是一致的,U+0000到U+00FF与ISO 8859-1(Latin-1)也是一致的。这里要注意的是它是以16bit为单位存储的,即便对字母“A”也是用16bit,这是与前面介绍的所有字符集不同的地方。

历史上,在国际标准化组织研究ISO10646标准的同时,另一个由多语言软件制造商组成的协会也在从事创立单一字符集的工作,这就是现在人们熟知的Unicode。后面,我们将视ISO10646和Unicode为同一个东西。

有了Unicode,似乎字符集问题有了一个近乎完美的解决方案(唯一明显的缺憾是原来的单字节字符要用两个字节来存储,要多用一些存储空间),但不要高兴得过早。由于历史的原因,一些操作系统,如Unix、Linux等都是基于ASCII设计的。此外,还有一些数据库管理系统软件,如Oracle等也是围绕ASCII来设计的(从Oracle 8i的白皮书上介绍的设置系统字符集和字段的字符集中可以间接地看出这一点)。在这些系统中直接用Unicode会导致严重的问题。用这些编码的字符串会包含一些特殊的字符,比如 '\0' 或 '/',它们在文件名和其他C库函数参数里都有特别的含义。另外,大多数使用ASCII文件的UNIX下的工具,如果不进行重大修改是无法读取16位的字符的。基于这些原因,在文件名、文本文件以及环境变量等地方直接使用Unicode是不合适的。

为了让Unicode字符集的应用落到实处,在ISO10646-1 Annex R和RFC 2279里定义的 UTF-8(Unicode Transformation Form 8-bit form)编码没有这些问题。

13.2.3  UTF-8字符集
UTF-8有以下一些特性:

UCS字符U+0000到U+007F(ASCII)被编码为字节0x00到0x7F(保证了与ASCII兼容)。这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种编码方式下是一样的。

所有大于U+007F的UCS字符被编码为一个多字节的串,每个字节都有标记位集。因此,ASCII字节(0x00-0x7F)不可能作为任何其他字符的一部分。

表示非ASCII字符的多字节串的第一个字节总是在0xC0到0xFD的范围内,并指出这个字符包含多少个字节(这可以从表格13.1中非常直观地看出,该字节由n个1带一个0的形式组成,n代表该字符要用的字节数)。多字节串的其余字节都在0x80到0xBF范围内。这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响。

UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP字符最多只用到3字节长。

字节0xFE和0xFF在UTF-8编码中从未用到。

Unicode到UTF-8的转换如下表所示:

表格13.1

Unicode
UTF-8

00000000-0000007F
0xxxxxxx

00000080-000007FF
110xxxxx 10xxxxxx

00000800-0000FFFF
1110xxxx 10xxxxxx 10xxxxxx

00010000-001FFFFF
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

00200000-03FFFFFF
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

04000000-7FFFFFFF
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


通过UTF-8这种形式,Unicode终于可以广泛的在各种情况下使用了。在讨论JSF的国际化编程之前,我们先来看看我们以前在JSP编程中是怎样处理中文问题的,以及我们经常遇到的中文乱码是怎样造成的。
分享到:
评论

相关推荐

    (资料大全加程序)C++ 字符串之间的相互转化 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR)

    - `宽字符集----转载 - 游子的博客 - IT博客.mht` 和 `宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR) - 轻轻浪花 - CSDN博客.mht` 这两个文件可能是博客文章的存档,详细讨论了宽字符集的使用和LPTSTR等相关...

    【转载】基于bp神经网络字符识别系统 matlab代码

    字符包括汉字,字母,数字和一些符号。汉字有几千个,字母有几十个,数字的类最少只有10个,...处理的数据集是放在10个文件夹里,文件夹的名称对应存放的手写数字图片的数字,每个数字500张,每张图片的像素统一为28*28

    深入分析 Java I/O 的工作机制(转载)

    Charset类提供了字符集的相关操作,InputStreamReader和OutputStreamWriter在创建时需要指定字符集。 总的来说,Java I/O机制是一个复杂但强大的体系,涵盖了从低级的字节流到高级的NIO框架。开发者需要根据实际...

    M35 GSM模块AT指令集PDF

    2. **串行接口控制命令**:设置数据通信相关参数,如波特率、流控类型、字符集等。 3. **状态控制命令**:获取和设置模块的状态信息,包括网络状态、SIM卡状态、错误报告等。 4. **SIM卡相关命令**:管理SIM卡信息,...

    转载 纯nasm实现中文操作系统.txt

    在标准ASCII码中无法直接表示中文字符,因此需要使用扩展的字符集或者通过特殊的编码方式来实现中文字符的显示。具体实现方法未在提供的代码片段中体现,但可以推测可能采用了自定义的中文字符集或编码方案。 #### ...

    【转载】正则表达式教程

    4. **预定义字符集**:如`\d`代表数字(等同于[0-9]),`\w`代表字母数字字符(等同于[a-zA-Z0-9_]),`\s`代表空白字符。 5. **转义字符**:`\`用于对特殊字符进行转义,使其失去原有含义,如`\.`匹配实际的句点...

    文本文件批量处理工具 开源

    目前的功能有:html清理、重新分段、简繁转换、字符集转换、扩展名修改、文件合并。这些功能都支持批量或是单个操作。 另外,还试了一下vista毛玻璃效果, 但是并不理想,只做为试验性质。 遵守GUN GPL许可方式...

    [转载]彻底解决简繁体软件乱码问题

    乱码通常出现在不支持特定字符集或者编码格式的软件上,导致文字无法正常显示,给用户带来了阅读和使用的不便。本文将深入探讨如何彻底解决简繁体软件乱码问题,并提供一个视频教程作为辅助学习资源。 首先,我们...

    程序设计说明书(转载)

    在数据库设计中,有一些约定和规范需要遵循,比如所有的命名应具有描述性,字符集统一为UTF-8,每个数据表的第一个字段为系统内部主键id,日期格式默认为varchar,且大多数字段不允许为空。这些规则有助于保持数据的...

    RAR密码破解工具Password Recovery(含注册码)

    可自设暴破字符集(支持非英文字符) 随时可中断破解进度,稍后可自断点继续 可后台运行,仅在闲置状态下占用 CPU 可选用自定义化的“暴破”方式,也可选用高效的字典方式 支持经 AES-128 算法加密的各类 RAR/...

    Java程序员面试的试题集(1_122)帮助初学者的技术问题(转载)

    相比之下,`StringBuffer` 提供了修改字符串的能力,适合在字符串需要频繁修改的情况下使用。此外,`StringBuffer` 是线程安全的,这意味着它可以安全地用于多线程环境,而 `String` 不具备这一特性。 #### 基本...

    本人提供SQL语句大全(转载) 12009年04月28日 星期二 19:35SQL语句大全(转载)

    - 避免不必要的字符串拼接或类型转换,如直接使用数值比较而非字符串比较。 - 在比较日期时,直接使用日期函数而非字符串函数可以提高效率。 ### 10. GROUP BY 和 HAVING 子句的使用 - **GROUP BY**:用于将数据...

    运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    对于包含复杂字符集的脚本,使用Unicode格式可以提供更好的兼容性。 在编写脚本时推荐使用专门的文本编辑器,比如Notepad++。Notepad++是一种功能强大的编辑器,它支持多种编码格式,并且提供了方便的编码转换工具...

    移远M26 AT命令手册

    用户需了解模块支持的字符集,以便在通信中使用正确的字符编码。同时,手册也介绍了硬件流控和软件流控的区别和使用场景。 #### 5. AT命令详解 手册详尽地列出了各种AT命令及其格式和用途。例如,“ATI”命令用于...

    M10 AT指令集详解

    - **AT+CSCS**:选择TE字符集。 - **AT+GCAP**:请求终端功能列表。 ##### 2. 串行接口控制命令 这些命令用于控制模块与外部设备之间的数据传输方式,如波特率设置、帧格式设置等。 - **AT&C**:设置DCD功能模式。...

    全国资源包最新版下载免费使用

    6、在新建好的连接上,右键新建数据库:数据库名随意,字符集用:utf8 -- UTF-8 Unicode,排序规则utf8_general_ci或随意。 7、在新建的数据库上右键-运行SQL文件-选中下载的地址数据库文件(position.sql)运行‘ ...

    解决网页乱码.zip

    charset=UTF-8`,其中`charset`属性定义了内容的字符集。而`request.setCharacterEncoding()`和`response.setCharacterEncoding()`则是设置请求和响应的编码方式,通常用于处理POST请求的数据编码。 ...

Global site tag (gtag.js) - Google Analytics