`
fantasy
  • 浏览: 516163 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中的字符集编码入门(二)

阅读更多
编码字符集与字符集编码的区别需要再一次强调的是,无论历史上的UCS还是现如今的Unicode,两者指的都是编码字符集,而不是字符集编码。花费一点时间来理解好这件事,然后你会发现对所有网页的,系统的,编码标准之间的来回转换等等繁杂事务都会思路清晰,手到擒来。

首先说说最一般意义上的字符集。
一个抽象字符集其实就是指字符的集合,例如所有的英文字母是一个抽象字符集,所有的汉字是一个抽象字符集,当然,把全世界所有语言的符号都放在一起,也可以称为一个抽象字符集,所以这个划分是相当人为的。之所以说“抽象”二字,是因为这里所提及的字符不是任何具体形式的字符,拿汉字中的“汉”这个字符来说,您在这篇文章中看到的这个“汉”其实是这个字符的一种具体表现形式,是它的图像表现形式,而且它是用中文(而非拼音)书写而成,使用宋体外观;而当人们用嘴发出“汉”这个音的时候,他们是在使用“汉”的另一种具体表现形式——声音,但无论如何,两者所指的字符都是“汉”这个字。同一个字符的表现形式可能有无数种(点阵表示,矢量表示,音频表示,楷体,草书等等等等),把每一种表现形式下的同一个字符都纳入到字符集中,会使得集合过于庞大,冗余高,也不好管理。因此抽象字符集中的字符,都是指唯一存在的抽象字符,而忽略它的具体表现形式。

抽象字符集中的诸多字符,没有顺序之分,谁也不能说哪个字符在哪个字符前面,而且这种抽象字符只有人能理解。在给一个抽象字符集合中的每个字符都分配一个整数编号之后(注意这个整数并没有要求大小),这个字符集就有了顺序,就成为了编码字符集。同时,通过这个编号,可以唯一确定到底指的是哪一个字符。当然,对于同一个字符,不同的字符集所制定的整数编号也不尽相同,例如“儿”这个字,在Unicode中,它的编号是0x513F,(为方便起见,以十六进制表示,但这个整数编号并不要求必须是以十六进制表示)意思是说它是Unicode这个编码字符集中的第0x513F个字符。而在另一种编码字符集比如Big5中,这个字就是第0xA449个字符了。这种情况的另一面是,许多字符在不同的编码字符集中被分配了相同的整数编号,例如英文字母“A”,在ASCII及Unicode中,均是第0x41个字符。我们常说的Unicode字符集,指的就是这种被分配了整数编号的字符集合,但要澄清的是,编码字符集中字符被分配的整数编号,不一定就是该字符在计算机中存储时所使用的值,计算机中存储的字符到底使用什么二进制整数值来表示,是由下面将要说到的字符集编码决定的。

字符集编码决定了如何将一个字符的整数编号对应到一个二进制的整数值,有的编码方案简单的将该整数值直接作为其在计算机中的表示而存储,例如英文字符就是这样,几乎所有的字符集编码方案中,英文字母的整数编号与其在计算机内部存储的二进制形式都一致。但有的编码方案,例如适用于Unicode字符集的UTF-8编码形式,就将很大一部分字符的整数编号作了变换后存储在计算机中。以“汉”字为例,“汉”的Unicode值为0x6C49,但其编码为UTF-8格式后的值为0xE6B189(注意到变成了三个字节)。这里只是举个例子,关于UTF-8的详细编码规则可以参看《Mapping codepoints to Unicode encoding forms》一文,URL为http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-AppendixA#sec3。
我们经常听说的另一种编码方案UTF-16,则对Unicode中的前65536个字符编号都不做变换,直接作为计算机存储时使用的值(对65536以后的字符,仍然要做变换),例如“汉”字的Unicode编号为0x6C49,那么经过UTF-16编码后存储在计算机上时,它的表示仍为0x6C49!。我猜,正是因为UTF-16的存在,使得很多人认为Unicode是一种编码(实际上,是一个字符集,再次重申),也因此,很多人说Unicode的时候,他们实际上指的是UTF-16。UTF-16提供了surrogate pair机制,使得Unicode中码位大于65536的那些字符得以表示。
Surrogate pair机制在目前来说实在不常用,甚至连一些UTF-16的实现都不支持,所以我不打算在这里多加讨论,其基本的思想就是用两个16位的编码表示一个字符(注意,只对码位超过65536的字符这么做)。Unicode如此死抱着16这个数字不放,有历史的原因,也有实用的原因。

当然还有一种最强的编码,UTF-32,他对所有的Unicode字符均不做变换,直接使用编号存储!(俗称的以不变应万变),只是这种编码方案太浪费存储空间(就连1个字节就可以搞定的英文字符,它都必须使用4个字节),因而尽管使用起来方便(不需要任何转换),却没有得到普及。
记得当初Unicode与UCS还没成家之时,UCS也是需要人爱,需要人疼的,没有自己的字符集编码怎么成。UCS-2与UCS-4就扮演了这样的角色。UCS-4与UTF-32除了名字不同以外,思想完全一样。而UCS-2与UTF-16在对前65536个字符的处理上也完全相同,唯一的区别只在于UCS-2 不支持surrogate pair机制,即是说,UCS-2只能对前65536个字符编码,对其后的字符毫无办法。不过现在再谈起字符编码的时候,UCS-2与UCS-4早已成为计算机史学家才会用到的词汇,就让它们继续留在故纸堆里吧。
分享到:
评论

相关推荐

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf

    Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    在Java编程语言中,理解和掌握字符集编码是至关重要的,特别是在处理各种文本数据时。本文主要探讨了编码字符集和字符集编码的区别,这对于软件开发人员来说是基础且必要的知识。 首先,我们要区分两个概念:编码...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.doc

    ### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...

    Java中的字符集编码入门(六)Java中的增补字符.doc

    ### Java中的字符集编码入门(六):Java中的增补字符 #### 一、引言 随着全球化进程的加速和技术的发展,字符集编码已经成为软件开发不可或缺的一部分。Java 作为一种广泛使用的编程语言,对于字符集的支持至关...

    Java中的字符集编码入门(清晰书签版)[借鉴].pdf

    Java中的字符集编码是编程领域中的重要概念,尤其在处理多语言环境时显得至关重要。本文主要探讨了字符编码的历史发展,特别是ASCII、Unicode和UCS的关系及其在Java中的应用。 ASCII,即美国标准信息交换码,是最早...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1[参考].pdf

    Java中的字符编码转换是编程实践中不可或缺的一部分,尤其是在处理多语言和跨平台的场景下。Java选择了UTF-16作为其内部字符表示的标准,这确保了在JVM内存中,所有字符都以统一的方式存储,避免了编码不一致带来的...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-049-Java基本语法-通过ASCII再理解字符编码.avi 北京动力节点-Java编程零基础教程-050-Java基本语法-ASCII.avi 北京动力节点-Java编程零基础教程-051-Java基本语法-ISO8859-1....

    java编程入门第八章输入与输出

    9. **字符集与编码** - Java中的字符编码默认使用Unicode,通过`Charset` 类可以处理不同的字符编码。 10. **文件复制** - 使用Java I/O可以实现文件的复制,通常结合`InputStream` 和 `OutputStream` 的read和...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    java源码 java ee基础入门实例 2018127

    例如,过滤器可以用来实现权限验证、字符编码转换、日志记录等功能。通过实现javax.servlet.Filter接口并配置在web.xml中,即可定义和注册过滤器。 5. **JDBC实例**: JDBC(Java Database Connectivity)是Java...

    Java NIO入门

    6. **字符集转换(Charset)**:NIO提供了一套完善的字符集转换机制,可以方便地进行字符编码和解码。 学习NIO,首先要理解如何创建和使用通道、缓冲区以及选择器。例如,通过`FileChannel`打开文件,然后使用`...

    动力节点Java基础301集_史上最全的Java基础教程

    动力节点的《Java基础301集》是一个全面且深入的Java入门教程,涵盖了从基础知识到高级特性的广泛内容,适合Java初学者和寻求巩固基础的学习者。以下是一些主要的知识点详解: 1. **数据结构**:教程详细介绍了单项...

    java精要初学者速学入门

    4. **数据编码.ppt**:可能涵盖了字符编码相关的知识,例如ASCII、Unicode和UTF-8等编码标准,以及在Java中如何处理字符串和字符流,这是处理文本数据时必须了解的部分。 5. **集合框架**:Java集合框架是处理对象...

    Java入门基础零基础学习

    #### 二、Unicode字符集 1. **简介**:Unicode是一种国际化的字符编码标准,旨在解决不同语言文字之间的兼容性问题。Java采用Unicode作为其字符集标准,确保程序可以处理各种语言文本。 2. **查看Unicode**:可以...

    java初学者入门的部分概念描述

    #### 十二、字符集编码 Java使用Unicode编码,这意味着它支持世界上几乎所有的字符集。Java的字符类型`char`占用16位,足以容纳Unicode的基本多文种平面(BMP)的所有字符。 以上是Java初学者入门所需掌握的一些...

    Java手机程序设计入门6

    - 在开发过程中确保使用的字体支持中文字符集。 - 对于界面上的文字显示,应采用适合中文显示的字体设置。 - 在编写代码时,处理字符串时要注意使用Unicode编码,以确保中文字符能够正确处理。 #### Lightweight ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境...

    动力节点Java基础301集

    以上就是“动力节点Java基础301集”所涵盖的主要知识点,这套教程不仅适合初学者入门,也适合有一定基础的学习者进一步提升自己的技能水平。通过系统学习这些知识点,相信每位学习者都能够打下坚实的Java编程基础。

Global site tag (gtag.js) - Google Analytics