最近深入研究了java内部字符串编码方式,发现大家在对java字符串编码认识上存在很大的分歧。网上的说法很多,其中很多都是不严谨的说法或者说是错误的说法。现在把常见认识误区列举如下:
误区一:
Java的字符串是unicode编码,java编码方式是unicode,Java内字符编码是unicode。
说明:上面的说法都提到unicode编码,这是非常不正确的说法。首先说下什么是unicode。以下摘自百度百科
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
简单说unicode只是规定了每个字符对应的数字,即码位,只是作字符集(charset)用,而不是程序编码(encoding)。
unicode是字符集,而utf-8,utf-16才是具体的编码方式,两者千万不能搞混了。
我假设java是unicode编码,那岂不是意味着每个字符至少要用3个字节(因最大数字0x10FFFF占用三个字节)来表示,这显示是不对的。
众所周知,java中的String类型实际是char数组构成的,一个char占用两个字节。
那为什么一个char占用两个字节?因为String实际采用UTF-16 编码方式存储所有字符。UTF-16规定用两个字节或四个字节来唯一表示unicode字符,因此java约定一个基本char类型占用两个字节,这样通过一个char或两个char就能唯一表示unicode字符。
综上所述,可以说java字符串采用的字符集是unicode,而编码方式是utf-16。
误区二:
java中一个汉字用一个char就能表示。
说明:根据上面所述,String采用UTF-16编码方式来存储字符,因此对于基本平面(BMP或平面0)的字符用一个char就能表示,但是对于其它平面的字符则需要两个char才能表示。简单说就是对于unicode的0-0xFFFF范围的字符用一个char就能表示,但是0x10000-0x10FFFF范围的字符就要用两个char才能表示。
那么就存在一个问题,java对内存中的两个连续的char,它怎么知道是一个char对应一个字符,还是这两个连续的char构成一个字符。这就涉及到unicode的特殊约定和utf-16编码的具体实现了。详细如下:
1、unicode约定平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。
2、UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
这样当程序遇到第一个char在D800-DBFF或DC00-DFFF范围时,就知道这个char是需要跟后面的char合并来对应一个字符。
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
因此,对于Java编程语言程序的认识误区的深入理解和正确指导,对于推动软件技术的发展以及提升Java项目的开发质量具有重要意义。在开发过程中,重视软件架构的灵活性,合理使用存储过程,并正确应用DDD理论,才能让...
总之,尽管在Java软件开发中存在一些误区,通过深入认识Java的起源、结构以及关键技术,并结合实践中的经验教训,我们可以更好地发挥Java在软件开发中的积极作用,推动软件开发管理的持续改进。
以下是对"Java编程语言程序的认识误区"的详细解析。 1. **Java是完全跨平台的** 许多人认为Java“一次编写,到处运行”的口号意味着它在所有操作系统上都能无差异运行。实际上,虽然JVM(Java虚拟机)提供了跨平台...
以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者习惯于在每个函数的开始部分都套用try-catch块,以为这样可以捕捉所有可能出现的异常。实际上,这种做法使得代码变得混乱...
六、字符编码问题常见误区 1. 忽略编码设置:读写文件或网络通信时,没有明确指定编码,可能导致乱码。 2. 不同系统默认编码不同:Windows和Unix系统默认编码不同,跨平台开发时要注意。 3. Unicode与非Unicode编码...
### Java中的字符集编码入门(六):Java中的增补字符 #### 一、引言 随着全球化进程的加速和技术的发展,字符集编码已经成为软件开发不可或缺的一部分。Java 作为一种广泛使用的编程语言,对于字符集的支持至关...
### JAVA多线程的两点误区 #### 一、线程启动与执行状态的理解误区 **误区解释:** 在Java多线程编程中,一个常见的误区是关于如何正确启动线程以及理解线程的状态。根据提供的代码片段,可以看到有一个`...
以下是对“软件测试中的认识误区”进行的详细解析: 1. **测试是找出所有错误**:一个常见的误区是认为测试的目标是找出软件中的所有缺陷。实际上,测试是为了验证软件是否满足预定的需求和功能,而完全消除所有...
然而, Java 软件开发中存在许多的误区,例如,软件开发人员和使用人员对 Java 软件缺乏深入的了解,对 Java 软件的架构和编程语言缺乏理解,对 Java 软件的应用和发展前景缺乏认识等等。 Java 软件开发中存在的...
在深入探讨Ruby与Java之间的误区时,我们首先要澄清一个普遍的误解:Ruby只适合小型项目,而Java更适合大型复杂项目。事实上,根据James Halloway的观点,选择哪种语言取决于项目的特点和需求。对于小型项目,Ruby ...
Java学习时,初学者往往容易陷入一些误区,这些误区可能会阻碍他们的学习进程和技能提升。以下是一些常见的问题和相应的解决建议: 1. **盲目追求高级特性**:有些学习者在接触Java时,过于热衷于尝试最新的特性和...
企业发展电子商务的认识误区辨析 电子商务是现代信息技术与企业经营管理技术相结合的产物,是当今企业经营与发展的锐利武器。但是,企业在发展电子商务决策过程中存在种种认识误区,影响了电子商务的发展和应用。...
本文将探讨Java软件开发中的常见误区。 首先,Java语言被认为过于复杂。这可能源于对Java语法和框架的不熟悉,以及对面向对象编程的理解不足。Java的设计理念是简洁和可维护,但初学者往往觉得其冗长的类库和繁琐的...
人力成本的认识误区.doc
浅谈组串式逆变器的历史及认识的误区
Java中的字符处理有时会让人困惑,比如字符编码、Unicode等。例如,Java使用Unicode编码,因此在处理特殊字符或非ASCII字符时需要注意。另外,字符与字符串的区别也很重要,字符用单引号括起来,字符串则用双引号。...
### Java自学编程误区知识点解析 #### 一、编程语言选择误区 - **纠结于语言的选择**:初学者往往会花费大量时间在选择编程语言上,比如是否应该选择PHP、Java、Python等,而不是专注于掌握一门语言的基础知识。 - ...