`
Wanghuidong
  • 浏览: 44875 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论
  • openFox: 确实,以前只知道编码是个名词,在项目中编码统一就可以了,原来是 ...
    java编码解惑
  • tianzizhi: 前段时间我也看了许多这方面的东西,基本理解了,拿楼主的总结再复 ...
    java编码解惑

java编码解惑

阅读更多

上篇关于java编码问题的总结发布之后,回头到家自己一想,只是按照自己的思路去记录了一下个人编码问题当中遇到的问题,分析还不够详细。今日提笔如下,希望大家给予点评.

1.先解释几个重要的概念:

<1>.字符集:一个字符的集合,仅仅如此,它只包含某某某些字符,没有别的意义。

<2>.编码字符集:即我们通常意义上要表示的 字符集,它将字符与一个数字一一对应(计算机只认数字)。例如 个人自定义编码字符集 whd 如下:

工:0X1001

人:0X1002

是:0X1003

好:0X1004

样:0X1005

的:0X1006

<3>.编码方式:即我们经常说的gbk gb2312 utf-8等等这样的所谓的编码。其实编码是一个动作,包含了编码字符集和编码方式,二者结合即构成“编码”。而并不是我们通常意义上理解的名词。

例如UTF-8编码这里我做一个个人理解的解释:使用单字节或双字节或三字节 三种方式(按情况需要所定)对unicode字符集进行转换的一种可变长编码。

 

2.或许大家对上面的解释还有些不明白。不着急下面一一详细分析。如果一个字符集有256个字符,那么在单字节的内存管理系统当中,每个字符用一个字节存储,足够。也就是说一个字符对应一个8位的二进制值(这个值我们称为码点)。但是如果字符集比较大,8位的单字节存储系统每个字节不足以唯一标识一个字符。这样就需要多个字节存储一个字符。

这样的情况下,例如65536个字符,最后一个字符就需要16位二进制位标识。那么第一个字符肯定不需要这么多内存位单元来标识。这样如果采用定长双字节的编码方式(例如GBK)就会造成大量的内存空间的浪费。在java平台,虚拟机的内存是有限的。java平台采用的unicode字符集更要尽可能的节省虚拟机内存空间,所以java平台采用Utf-8的编码方式。采用可变长字节编码。对生僻字采用单字节,对经常使用的采用双字节或最多3字节编码。

如下是从网上找到的unicode 与utf-8的转换规则:

0000 - 007F  :0xxxxxxx (单字节)

0080 - 07FF  :110xxxxx 10xxxxxx (双字节)

0800 - FFFF :1110xxxx 10xxxxxx 10xxxxxx (三字节)
对于unicode码点在0000-007F之间的采用 第一种(单字节)编码方式,对于在0080-07ff之间的unicode值采用第二种(双字节)编码方式,例如汉字的unicode 值是从4E00-9FC3(百度文库至2008年止的数据),基本都在0800-FFFF这个三字节模板范围内,所以使用UTF-8编码方案的话都是存储的3个字节。例如汉字“五”unicode值为4E94,转换为2进制比特流为:0100 1110 10 01 0100 将此比特流变换组合方式 按照 UTF-8的三字节模板填充到里面取代三字节模板里面的X,即构成了11100100 10111010 10010100 即 最后得到的UTF-8编码值为11100100  10111010   10010100 即E4 BA 94。

用程序验证一下:

String s="五";
   byte b[]=s.getBytes("utf-8");
   for(int i=0;i<b.length;i++){
    System.out.println(b[i]);
   }

依次打印出来:-28 -70 -108。(计算机均为补码显示)转换为二进制负数的原码

-28 原码为1110 0100

-70 原码为1011 1010

 -108原码为1001 0100刚好跟最后得到的UTF-8编码值为11100100  10111010   10010100 一致。

 

3.上面只是以UTF-8为例讲述一下 字符集 编码字符集 编码实现方案 之间的关系。同样GBK 也和UTF-8一样有类似的与unicode转换的规则。因为GBK 是双字节定长编码,所以转换规则为 110XXXXX 10XXXXXX。不同的编码方式采用不同的转换规则,这样构成了所谓的“编码”

分享到:
评论
2 楼 openFox 2011-06-20  
确实,以前只知道编码是个名词,在项目中编码统一就可以了,原来是这么深
1 楼 tianzizhi 2011-06-16  
前段时间我也看了许多这方面的东西,基本理解了,拿楼主的总结再复习下

相关推荐

    Java解惑 清晰版带书签

    根据提供的文件信息,“Java解惑 清晰版带书签”这一标题暗示这是一本深入探讨Java编程语言中常见问题及解决方案的专业书籍。该书由《Effective Java》的作者所著,因此我们可以推断出这本书将包含许多实用的Java...

    java 解惑.pdf

    ### Java解惑知识点详解 #### 一、表达式谜题 **谜题1:奇数性** - **描述**:程序看似应该返回一个布尔值,表明一个数字是否为奇数,但结果却出乎意料。 - **解惑**:在进行模运算时,需要注意负数的情况。当输入...

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    Java中字符以Unicode编码,因此处理字符时需要理解Unicode的特性。例如,`'\u0061'`表示字符'a',而单引号内的字符不是字符串,而是字符常量。此外,字符和字符串的操作有特定的方法,如`charAt()`用于获取字符串中...

    java解惑(罗列了95个容易让你迷惑的java知识点)

    以下就是针对标题"java解惑(罗列了95个容易让你迷惑的java知识点)"中提及的一些关键知识点的详细解释。 1. **Java内存模型**:Java内存模型(JMM)规定了线程如何共享和访问数据,包括主内存、工作内存以及内存间的...

    java疑难问题解惑

    在Java中,字符(char)类型是Unicode编码的,所以当两个char类型相加时,它们实际上是进行Unicode码点的加法。例如,'a' + 'b' 的结果是 'c',因为'a'的Unicode码点是97,'b'是98,两者相加得到99,对应的字符是'c'。...

    Java面试题及解惑

    ### Java基础知识 #### 1. Java的基本数据类型与String类型的区别 - **基本数据类型**:Java中的基本数据类型包括`byte`, `short`, `int`, `long`, `float`, `double`, `char`, `boolean`。它们是值类型,直接存储...

    JAVA面试题解惑系列(六)——字符串(String)杂谈[收集].pdf

    一个中文汉字在Java中占用两个字节,这是因为Java的`char`类型是16位的,能够容纳Unicode编码,而一个中文汉字通常由两个字节的Unicode编码表示。因此,一个中文汉字可以安全地存储在`char`变量中。然而,单个英文...

    IT学生解惑真经 IT学生解惑真经

    从需求分析、设计、编码到测试和维护,了解软件开发生命周期的每个阶段,以及如何运用敏捷开发和Scrum等方法论,将有助于学生成长为一名优秀的软件工程师。 总的来说,《IT学生解惑真经》是一本全方位指导IT学习者...

    Java工程师新人入门书籍推荐

    - 《Java解惑》:解答Java中的疑难问题,增进对语言特性的理解。 - 《分布式Java应用:基础与实践》:淘宝架构师的经验分享,对分布式系统有深入阐述。 在学习过程中,除了阅读书籍,实践是必不可少的。尝试编写...

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

    5.4.5 实现字符编码过滤器 5.5 实战检验 5.5.1 通过Servlet实现录入用户信息 5.5.2 应用过滤器实现网页计数器 5.6 疑难解惑 5.6.1 访问Servlet出现404错误 5.6.2 修改Servlet无效 5.6.3 创建过滤器并没有实现过滤...

    IT学生解惑真经

    软件开发流程:理解软件开发的全生命周期,包括需求分析、设计、编码、测试、部署和维护等。熟悉敏捷开发和版本控制工具(如Git)的使用,也是十分重要的技能。 项目经验:通过参与实际的项目,学生可以将所学知识...

    基于JAVA的聊天室设计与实现

    5. 详细设计和编码调试,这是整个项目的核心部分,需要花费大量时间。 6. 编写实训报告,记录整个过程和经验。 7. 最后,进行验收和简单考核,包括答辩和综合评分。 实训的管理方面,学生需在系统分析与设计阶段与...

    51CTO学院-《Java编程思想》精讲视频教程(上部).docx

    - **解惑释疑 Java 难点和疑点**:针对常见的问题和困惑进行解答,帮助学员克服学习障碍。 #### 适用人群 - **Java 初学者**:适合完全没有接触过 Java 或者仅有初步了解的学员。 - **有经验的 Java 程序员**:对于...

    java毕业设计&课设-生鲜商城.zip

    3. **MyBatis**:这是一个持久层框架,它允许开发者用简单的Java代码来操作数据库,避免了大量SQL的硬编码,提高了开发效率。 4. **Thymeleaf**或JSP:作为视图解析技术,它们负责将后端的数据渲染成用户可见的网页...

    IT学生解惑真经.rar

    编程语言是IT学生的工具箱,本书可能涵盖多种常用语言如Python、Java、C++等的语法特性、编程模式和最佳实践。通过实例解析,引导学生从入门到精通,掌握编写高效、可读性强的代码的技巧。 在软件工程部分,本书...

Global site tag (gtag.js) - Google Analytics