`
charlesEye
  • 浏览: 7181 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

字符集详解(转载)

 
阅读更多
  • ASCII 码

学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。

  • ISO-8859-1

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。

  • GB2312

它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

  • GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

  • GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。

  • UTF-16

说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。

  • UTF-8

UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。

UTF-8 有以下编码规则:

  1. 如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
  2. 如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
  3. 如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节
 
 

内存中操作中的编码

在 Java 开发中除了 I/O 涉及到编码外,最常用的应该就是在内存中进行字符到字节的数据类型的转换,Java 中用 String 表示字符串,所以 String 类就提供转换到字节的方法,也支持将字节转换为字符串的构造函数。如下代码示例:

 String s = "这是一段中文字符串"; 
 byte[] b = s.getBytes("UTF-8"); 
 String n = new String(b,"UTF-8");

几种编码格式的比较

对中文字符后面四种编码格式都能处理,GB2312 与 GBK 编码规则类似,但是 GBK 范围更大,它能处理所有汉字字符,所以 GB2312 与 GBK 比较应该选择 GBK。UTF-16 与 UTF-8 都是处理 Unicode 编码,它们的编码规则不太相同,相对来说 UTF-16 编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好。它适合在本地磁盘和内存之间使用,可以进行字符和字节之间快速切换,如 Java 的内存编码就是采用 UTF-16 编码。但是它不适合在网络之间传输,因为网络传输容易损坏字节流,一旦字节流损坏将很难恢复,想比较而言 UTF-8 更适合网络传输,对 ASCII 字符采用单字节存储,另外单个字符损坏也不会影响后面其它字符,在编码效率上介于 GBK 和 UTF-16 之间,所以 UTF-8 在编码效率上和编码安全性上做了平衡,是理想的中文编码方式。

分享到:
评论

相关推荐

    M10 AT指令集详解

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

    Java字节码(.class文件)格式详解((转载)

    - **常量池**:存储各种字面量和符号引用,如字符串、类名、方法名等,是字节码的核心部分。 - **访问标志**:表示类或接口的访问权限和特性,如public、final、abstract等。 - **类和父类索引**:指明类的全限定...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    M35 GSM模块AT指令集PDF

    #### 指令集详解 - **ATI**:用于显示产品ID信息。 - **AT+GMI**、**AT+CGMI**:分别用于请求制造商ID信息。 - **AT+GMM**、**AT+CGMM**:分别用于请求TA(终端适配器)制造商和型号信息。 - **AT+GMR**、**AT+CGMR...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. ...

    移远M26 AT命令手册

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

    解决网页乱码.zip

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

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

    ### Java程序员面试知识点详解 #### 面向对象的四大特征 在面向对象编程中,有四个核心概念:抽象、继承、封装和多态性。 1. **抽象**:抽象是面向对象编程的一个关键概念,它关注于事物的核心特征,忽略不相关的...

    jstl源代码,转载内容

    **JSTL(JavaServer Pages Standard Tag Library)详解** JSTL是JavaServer Pages标准标签库,它提供了一组预定义的标签,用于简化JSP页面的开发,使其更加结构化,可读性更强,同时也降低了Java代码在页面中的使用...

    Excel表导入sqlserver(转载的,已试过成功)

    ### Excel表导入Sqlserver知识点详解 #### 一、前言 在实际工作中,我们经常会遇到需要将Excel数据导入到SQL Server数据库中的需求。本篇文章基于一个成功的案例进行讲解,主要介绍如何通过编程的方式实现Excel...

    webfilter的教程

    `Filter`可以用于确保所有请求都被正确地解码为UTF-8或其他指定的字符集。通过重写`doFilter`方法,我们可以捕获请求,并使用`HttpServletRequest`的`setCharacterEncoding`方法来设置合适的字符编码,防止乱码问题...

    arcgis工具

    25.属性表中选择集与非选择集的切换 Options/switch selection 26.快速把选择的要素另存为一个图层并加载进来。 先选责需要另存图层的要素(直接选择或者属性表),然后在图层上右键Selection/create Layer From ...

Global site tag (gtag.js) - Google Analytics