上篇关于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。不同的编码方式采用不同的转换规则,这样构成了所谓的“编码”
相关推荐
根据提供的文件信息,“Java解惑 清晰版带书签”这一标题暗示这是一本深入探讨Java编程语言中常见问题及解决方案的专业书籍。该书由《Effective Java》的作者所著,因此我们可以推断出这本书将包含许多实用的Java...
### Java解惑知识点详解 #### 一、表达式谜题 **谜题1:奇数性** - **描述**:程序看似应该返回一个布尔值,表明一个数字是否为奇数,但结果却出乎意料。 - **解惑**:在进行模运算时,需要注意负数的情况。当输入...
【Java解惑很全的题目】是一份专为Java学习者设计的疑难解答文档,它包含了一系列关于Java编程语言的问题和谜题,旨在帮助读者深入理解Java的核心概念、语法特性和编程技巧。以下是对其中部分题目及其涉及知识点的...
Java中字符以Unicode编码,因此处理字符时需要理解Unicode的特性。例如,`'\u0061'`表示字符'a',而单引号内的字符不是字符串,而是字符常量。此外,字符和字符串的操作有特定的方法,如`charAt()`用于获取字符串中...
以下就是针对标题"java解惑(罗列了95个容易让你迷惑的java知识点)"中提及的一些关键知识点的详细解释。 1. **Java内存模型**:Java内存模型(JMM)规定了线程如何共享和访问数据,包括主内存、工作内存以及内存间的...
### JAVA面试题解惑系列:深入理解静态变量与实例变量 在JAVA的面试过程中,面试官经常通过设计一些关于类的初始化顺序的问题来评估应聘者对JAVA基础的理解深度。其中,静态变量与实例变量的区别及它们的初始化顺序...
在Java中,字符(char)类型是Unicode编码的,所以当两个char类型相加时,它们实际上是进行Unicode码点的加法。例如,'a' + 'b' 的结果是 'c',因为'a'的Unicode码点是97,'b'是98,两者相加得到99,对应的字符是'c'。...
### Java基础知识 #### 1. Java的基本数据类型与String类型的区别 - **基本数据类型**:Java中的基本数据类型包括`byte`, `short`, `int`, `long`, `float`, `double`, `char`, `boolean`。它们是值类型,直接存储...
一个中文汉字在Java中占用两个字节,这是因为Java的`char`类型是16位的,能够容纳Unicode编码,而一个中文汉字通常由两个字节的Unicode编码表示。因此,一个中文汉字可以安全地存储在`char`变量中。然而,单个英文...
从需求分析、设计、编码到测试和维护,了解软件开发生命周期的每个阶段,以及如何运用敏捷开发和Scrum等方法论,将有助于学生成长为一名优秀的软件工程师。 总的来说,《IT学生解惑真经》是一本全方位指导IT学习者...
- 《Java解惑》:解答Java中的疑难问题,增进对语言特性的理解。 - 《分布式Java应用:基础与实践》:淘宝架构师的经验分享,对分布式系统有深入阐述。 在学习过程中,除了阅读书籍,实践是必不可少的。尝试编写...
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 创建过滤器并没有实现过滤...
软件开发流程:理解软件开发的全生命周期,包括需求分析、设计、编码、测试、部署和维护等。熟悉敏捷开发和版本控制工具(如Git)的使用,也是十分重要的技能。 项目经验:通过参与实际的项目,学生可以将所学知识...
5. 详细设计和编码调试,这是整个项目的核心部分,需要花费大量时间。 6. 编写实训报告,记录整个过程和经验。 7. 最后,进行验收和简单考核,包括答辩和综合评分。 实训的管理方面,学生需在系统分析与设计阶段与...
- **解惑释疑 Java 难点和疑点**:针对常见的问题和困惑进行解答,帮助学员克服学习障碍。 #### 适用人群 - **Java 初学者**:适合完全没有接触过 Java 或者仅有初步了解的学员。 - **有经验的 Java 程序员**:对于...
3. **MyBatis**:这是一个持久层框架,它允许开发者用简单的Java代码来操作数据库,避免了大量SQL的硬编码,提高了开发效率。 4. **Thymeleaf**或JSP:作为视图解析技术,它们负责将后端的数据渲染成用户可见的网页...
编程语言是IT学生的工具箱,本书可能涵盖多种常用语言如Python、Java、C++等的语法特性、编程模式和最佳实践。通过实例解析,引导学生从入门到精通,掌握编写高效、可读性强的代码的技巧。 在软件工程部分,本书...