`
zhuyuanxiang
  • 浏览: 130609 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

字符集基础知识介绍(转-请作者与我联系)

阅读更多

<!----> <o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

1                概述 <o:p> </o:p>

本文主要包括以下几个方面:编码基本知识, JAVA ,系统软件, URL ,工具软件等。在下面的描述中,将以 " 中文 " 两个字为例,经查表可以知道其 GB2312 编码是 "d6d0 cec4" Unicode 编码为 "4e2d 6587" UTF 编码就是 "e4b8ad e69687" 。注意,这两个字没有 ISO8859-1 编码,但可以用 ISO8859-1 编码来 " 表示 " <o:p> </o:p>

2                编码基本知识 <o:p> </o:p>

最早的编码是 ISO8859-1 ,和 ASCII 编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。 <o:p> </o:p>

2.1          ISO8859-1<o:p></o:p>

属于单字节编码,最多能表示的字符范围是 0-255 ,应用于英文系列。比如,字母 'a' 的编码为 0x61=97 。很明显, ISO8859-1 编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用 ISO8859-1 编码来表示。而且在很多协议上,默认使用该编码。比如,虽然 " 中文 " 两个字不存在 ISO8859-1 编码,以 GB2312 编码为例,应该是 "d6d0 cec4" 两个字符,使用 ISO8859-1 编码的时候则将它拆开为 4 个字节来表示: "d6 d0 ce c4" (事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是 UTF 编码,则是 6 个字节 "e4 b8 ad e6 96 87" 。很明显,这种表示方法还需要以另一种编码为基础。 <o:p> </o:p>

2.2          GB2312/GBK<o:p></o:p>

这就是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和 ISO8859-1 一致(兼容 ISO8859-1 编码)。其中 GBK 编码能够用来同时表示繁体字和简体字,而 GB2312 只能表示简体字, GBK 是兼容 GB2312 编码的。 <o:p> </o:p>

2.3          Unicode<o:p></o:p>

这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容 ISO8859-1 编码的,也不兼容任何编码。不过,相对于 ISO8859-1 编码来说, Unicode 编码只是在前面增加了一个 0 字节,比如字母 'a' "00 61" <o:p> </o:p>

需要说明的是,定长编码便于计算机处理(注意 GB2312/GBK 不是定长编码),而 Unicode 又可以用来表示所有字符,所以在很多软件内部是使用 Unicode 编码来处理的,比如 JAVA <o:p> </o:p>

2.4          UTF<o:p></o:p>

考虑到 Unicode 编码不兼容 ISO8859-1 编码,而且容易占用更多的空间:因为对于英文字母, Unicode 也需要两个字节来表示。所以 Unicode 不便于传输和存储。因此而产生了 UTF 编码, UTF 编码兼容 ISO8859-1 编码,同时也可以用来表示所有语言的字符,不过, UTF 编码是不定长编码,每一个字符的长度从 1-6 个字节不等。另外, UTF 编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。 <o:p> </o:p>

注意,虽然说 UTF 是为了使用更少的空间而使用的,但那只是相对于 Unicode 编码来说,如果已经知道是汉字,则使用 GB2312/GBK 无疑是最节省的。不过另一方面,值得说明的是,虽然 UTF 编码对汉字使用 3 个字节,但即使对于汉字网页, UTF 编码也会比 Unicode 编码节省,因为网页中包含了很多的英文字符。 <o:p> </o:p>

3                JAVA 对字符的处理 <o:p> </o:p>

JAVA 应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。 <o:p> </o:p>

3.1          .getBytes(String charset)<o:p></o:p>

这是 JAVA 字符串处理的一个标准函数,其作用是将字符串所表示的字符按照 charset 编码,并以字节方式表示。注意字符串在 JAVA 内存中总是按 Unicode 编码存储的。比如 " 中文 " ,正常情况下(即没有错误的时候)存储为 "4e2d 6587" ,如果 charset "GBK" ,则被编码为 "d6d0 cec4" ,然后返回字节 "d6 d0 ce c4" 。如果 charset "UTF8" 则最后是 "e4 b8 ad e6 96 87" 。如果是 "ISO8859-1" ,则由于无法编码,最后返回 "<!----><st1:chmetcnv w:st="on" unitname="F" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3f</st1:chmetcnv><st1:chmetcnv w:st="on" unitname="F" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3f</st1:chmetcnv>" (两个问号)。 <o:p> </o:p>

3.2          new String(String charset)<o:p></o:p>

这是 JAVA 字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照 charset 编码进行组合识别,最后转换为 Unicode 存储。参考上述 getBytes 的例子, "GBK" "UTF8" 都可以得出正确的结果 "4e2d 6587" ,但 ISO8859-1 最后变成了 "<st1:chmetcnv w:st="on" unitname="F" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">003f</st1:chmetcnv><st1:chmetcnv w:st="on" unitname="F" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">003f</st1:chmetcnv>" (两个问号)。因为 UTF8 可以用来表示 / 编码所有字符,所以 new String( str.getBytes( "UTF8" ), "UTF8" ) == str ,即完全可逆。 <o:p> </o:p>

3.3          setCharacterEncoding()<o:p></o:p>

该函数用来设置 http 请求或者相应的编码。对于 request ,是指提交内容的编码,指定后可以通过 getParameter() 则直接获得正确的字符串,如果不指定,则默认使用 ISO8859-1 编码,需要进一步处理。参见下述 " 表单输入 " 。值得注意的是在执行 setCharacterEncoding() 之前,不能执行任何 getParameter() JAVA doc 上说明: This method must be called prior to reading request parameters or reading input using getReader() 。而且,该指定只对 POST 方法有效,对 GET 方法无效。分析原因,应该是在执行第一个 getParameter() 的时候, JAVA 将会按照编码分析所有的提交内容,而后续的 getParameter() 不再进行分析,所以 setCharacterEncoding() 无效。而对于 GET 方法提交表单是,提交的内容在 URL 中,一开始就已经按照编码分析所有的提交内容, setCharacterEncoding() 自然就无效。对于 response ,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。 <o:p> </o:p>

3.4          处理过程 <o:p> </o:p>

下面分析两个有代表性的例子,说明 JAVA 对编码有关问题的处理方法。 <o:p> </o:p>

Ø         表单输入 <o:p> </o:p>

User input  *(GBK:d6d0 cec4)  browser  *(GBK:d6d0 cec4)  web server  ISO8859-1(00d6 00d 000ce <st1:chmetcnv w:st="on" unitname="C" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">00c</st1:chmetcnv>4)  class ,需要在 class 中进行处理: getbytes("ISO8859-1") d6 d0 ce c4 new String("GBK") d6d0 cec4 ,内存中以 Unicode 编码则为 4e2d 6587 <o:p> </o:p>

1.      用户输入的编码方式和页面指定的编码有关,也和用户的操作系统有关,所以是不确定的,上例以 GBK 为例。 <o:p> </o:p>

2.      browser web server ,可以在表单中指定提交内容时使用的字符集,否则会使用页面指定的编码。而如果在 url 中直接用 ? 的方式输入参数,则其编码往往是操作系统本身的编码,因为这时和页面无关。上述仍旧以 GBK 编码为例。 <o:p> </o:p>

3.      Web server 接收到的是字节流,默认时( getParameter )会以 ISO8859-1 编码处理之,结果是不正确的,所以需要进行处理。但如果预先设置了编码(通过 request. setCharacterEncoding () ),则能够直接获取到正确的结果。 <o:p> </o:p>

4.      在页面中指定编码是个好习惯,否则可能失去控制,无法指定正确的编码。 <o:p> </o:p>

Ø         文件编译 <o:p> </o:p>

假设文件是 GBK 编码保存的,而编译有两种编码选择: GBK 或者 ISO8859-1 ,前者是中文 windows 的默认编码,后者是 linux 的默认编码,当然也可以在编译时指定编码。 <o:p> </o:p>

Jsp  *(GBK:d6d0 cec4)  JAVA file  *(GBK:d6d0 cec4)  compiler read  uincode(GBK: 4e2d 6587; ISO8859-1: 00d6 00d 000ce <st1:chmetcnv w:st="on" unitname="C" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">00c</st1:chmetcnv>4)  compiler write  UTF(GBK: e4b8ad e69687; ISO8859-1: *)  compiled file  Unicode(GBK: 4e2d 6587; ISO8859-1: 00d6 00d 000ce <st1:chmetcnv w:st="on" unitname="C" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">00c</st1:chmetcnv>4)  class 。所以用 GBK 编码保存,而用 ISO8859-1 编译的结果是不正确的。 <o:p> </o:p>

class  Unicode(4e2d 6587)  system.out / jsp.out  GBK(d6d0 cec4)  os console / browser <o:p> </o:p>

1.      文件可以以多种编码方式保存,中文 windows 下,默认为 ANSI/GBK <o:p> </o:p>

2.      编译器读取文件时,需要得到文件的编码,如果未指定,则使用系统默认编码。一般 class 文件,是以系统默认编码保存的,所以编译不会出问题,但对于 jsp 文件,如果在中文 windows 下编辑保存,而部署在英文 linux 下运行 / 编译,则会出现问题。所以需要在 jsp 文件中用 pageEncoding 指定编码。

分享到:
评论

相关推荐

    车牌字符数据集-69类-包含汉字-英文-数字-两种

    标题中的“车牌字符数据集-69类-包含汉字-英文-数字-两种”表明这是一个专门针对车牌字符识别的多类别数据集。这个数据集包含了69个不同的字符类别,其中包括汉字、英文和数字,这使得它非常适合用于训练深度学习...

    批量转换字符集的小工具

    标题中的“批量转换字符集的小工具”指的是一个能够处理大量文件,将它们的字符编码从一种格式转换到另一种格式的应用程序。在IT领域,字符集转换是常见的需求,尤其是在处理不同地区、语言或平台的文本数据时。例如...

    字符集编码和理解材料

    总的来说,这个压缩包中的资料提供了从基础知识到具体编程实践的全面视角,涵盖了字符集编码的核心概念,包括字符集的选择、编码方式的比较以及在实际编程中的应用。对于理解字符编码的复杂性和重要性,以及如何在...

    php字符集转换

    了解了字符集的基础知识之后,我们来具体看看PHP中字符集转换的相关知识点。在PHP中,字符集转换经常涉及到从一种编码转换到另一种编码,而PHP提供了iconv函数来实现这个功能。iconv函数非常强大,它能够将字符串从...

    计算机专业基础理论电子书合集07----编程语言:python (1)

    《Python核心编程》是Python初学者和进阶者的重要参考书籍,它全面覆盖了Python的基础知识,包括语法、数据结构、文件处理、网络编程、数据库接口、多线程和模块化编程等。作者Wesley Chun深入浅出地介绍了Python的...

    8、ACM相关的书籍介绍-2020-12-25.pdf

    - 算法竞赛入门指南:基础知识介绍。 - 进阶训练:高级算法和技术讲解。 - 知识点详解:覆盖所有竞赛所需知识点。 - 精讲视频:配套视频帮助理解难点。 - 模拟训练:模拟真实竞赛环境进行训练。 #### 8. ACM...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    第一部分“基础知识”(第1—2章)介绍基本算法分析原理。第二部分“数据结构”(第3~5章)讲解算法分析中必须掌握的数据结构知识,主要包括基本数据结构、抽象数据结构、递归和树。第三部分“排序”(第6~11章)...

    IBM COBOL Language Reference for AIX

    通过上述内容的详细介绍,《IBM COBOL Language Reference for AIX》不仅为初学者提供了全面的基础知识介绍,也为有经验的开发者提供了深入的技术细节和实践指导。无论是对于学习还是实际开发工作而言,这本书都具有...

    gbk转换utf-8工具!绝对给力!

    GBK是在GB2312基础上增加了更多的汉字和符号,而UTF-8是一种变长编码,能表示Unicode字符集,包含全世界大部分语言的字符。 2. **GBK编码**:GBK是中国大陆使用的广泛汉字编码标准,它包含了GB2312的所有字符,并且...

    Java基础知识的详细总结

    本部分主要介绍Java的一些基础知识,并且强调了这些知识是作者在日常实践中总结提炼出来的。 - **Java的特点**: - 跨平台性:Java程序可以运行在任何安装了Java虚拟机(JVM)的操作系统上。 - 安全性:Java提供...

    python基础教程

    ### Python基础教程知识点总结 #### Python第1课:安装 - **知识点**: - Python的版本选择(如Python 3.x版本)。 - 安装Python的步骤,包括官方下载页面的选择、安装包下载及安装过程中的注意事项(如添加环境...

    Html 基础知识.docx

    - `&lt;head&gt;`:包含了文档的元数据,如标题、字符集设置、作者信息等,它必须出现在`&lt;body&gt;`之前。 - `&lt;body&gt;`:文档的主体部分,展示实际的内容,可以设置字体、背景色等属性。 在`&lt;head&gt;`标签中,有两个重要的元素...

    Java 7 A Beginner’s Tutorial, 3rd Edition.pdf

    - 适合 Java 初学者阅读,提供全面的基础知识介绍。 - 包括实际案例和练习,帮助读者掌握 Java 编程技能。 - **下载与安装 Java:** - 提供了下载 Java SDK 和 IDE 的指南。 - 介绍了如何配置开发环境以准备...

    在R中处理字符串.pdf

    文档假设读者具备一定的正则表达式基础知识,因此会更加专注于如何在R中应用这些知识来解决问题。 2. **字符串操作**:文档还详细介绍了R语言中进行字符串操作的各种方法,包括但不限于字符串的分割、连接、替换等...

    Windows XP API编程终极指南

    - **双字节字符集**:解释了双字节字符集(DBCS)的概念及其在亚洲语言中的应用。 - **Unicode拯救**:阐述了Unicode的设计理念及其优势。 - **宽字符与C语言**: - **char数据类型**:说明了char数据类型的特性和...

Global site tag (gtag.js) - Google Analytics