上篇关于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中字符以Unicode编码,因此处理字符时需要理解Unicode的特性。例如,`'\u0061'`表示字符'a',而单引号内的字符不是字符串,而是字符常量。此外,字符和字符串的操作有特定的方法,如`charAt()`用于获取字符串中...
以下就是针对标题"java解惑(罗列了95个容易让你迷惑的java知识点)"中提及的一些关键知识点的详细解释。 1. **Java内存模型**:Java内存模型(JMM)规定了线程如何共享和访问数据,包括主内存、工作内存以及内存间的...
在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++等的语法特性、编程模式和最佳实践。通过实例解析,引导学生从入门到精通,掌握编写高效、可读性强的代码的技巧。 在软件工程部分,本书...