`
tang9140
  • 浏览: 35105 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java字符串编码认识误区说明

 
阅读更多

最近深入研究了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编程语言程序的认识误区.pdf

    因此,对于Java编程语言程序的认识误区的深入理解和正确指导,对于推动软件技术的发展以及提升Java项目的开发质量具有重要意义。在开发过程中,重视软件架构的灵活性,合理使用存储过程,并正确应用DDD理论,才能让...

    关于Java在软件开发中的误区分析.pdf

    总之,尽管在Java软件开发中存在一些误区,通过深入认识Java的起源、结构以及关键技术,并结合实践中的经验教训,我们可以更好地发挥Java在软件开发中的积极作用,推动软件开发管理的持续改进。

    Java编程语言程序的认识误区.zip

    以下是对"Java编程语言程序的认识误区"的详细解析。 1. **Java是完全跨平台的** 许多人认为Java“一次编写,到处运行”的口号意味着它在所有操作系统上都能无差异运行。实际上,虽然JVM(Java虚拟机)提供了跨平台...

    Java 异常处理的误区和经验总结

    以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者习惯于在每个函数的开始部分都套用try-catch块,以为这样可以捕捉所有可能出现的异常。实际上,这种做法使得代码变得混乱...

    深入分析 Java 中的中文编码问题

    六、字符编码问题常见误区 1. 忽略编码设置:读写文件或网络通信时,没有明确指定编码,可能导致乱码。 2. 不同系统默认编码不同:Windows和Unix系统默认编码不同,跨平台开发时要注意。 3. Unicode与非Unicode编码...

    Java中的字符集编码入门(六)Java中的增补字符.doc

    ### Java中的字符集编码入门(六):Java中的增补字符 #### 一、引言 随着全球化进程的加速和技术的发展,字符集编码已经成为软件开发不可或缺的一部分。Java 作为一种广泛使用的编程语言,对于字符集的支持至关...

    JAVA 多线程的两点误区

    ### JAVA多线程的两点误区 #### 一、线程启动与执行状态的理解误区 **误区解释:** 在Java多线程编程中,一个常见的误区是关于如何正确启动线程以及理解线程的状态。根据提供的代码片段,可以看到有一个`...

    软件测试中的认识误区

    以下是对“软件测试中的认识误区”进行的详细解析: 1. **测试是找出所有错误**:一个常见的误区是认为测试的目标是找出软件中的所有缺陷。实际上,测试是为了验证软件是否满足预定的需求和功能,而完全消除所有...

    关于Java软件开发中存在的误区分析.pdf

    然而, Java 软件开发中存在许多的误区,例如,软件开发人员和使用人员对 Java 软件缺乏深入的了解,对 Java 软件的架构和编程语言缺乏理解,对 Java 软件的应用和发展前景缺乏认识等等。 Java 软件开发中存在的...

    深度剖析Ruby vs Java误区

    在深入探讨Ruby与Java之间的误区时,我们首先要澄清一个普遍的误解:Ruby只适合小型项目,而Java更适合大型复杂项目。事实上,根据James Halloway的观点,选择哪种语言取决于项目的特点和需求。对于小型项目,Ruby ...

    Java学习时容易陷入的误区

    Java学习时,初学者往往容易陷入一些误区,这些误区可能会阻碍他们的学习进程和技能提升。以下是一些常见的问题和相应的解决建议: 1. **盲目追求高级特性**:有些学习者在接触Java时,过于热衷于尝试最新的特性和...

    企业发展电子商务的认识误区辨析.docx

    企业发展电子商务的认识误区辨析 电子商务是现代信息技术与企业经营管理技术相结合的产物,是当今企业经营与发展的锐利武器。但是,企业在发展电子商务决策过程中存在种种认识误区,影响了电子商务的发展和应用。...

    浅谈JAVA软件开发的几大误区.pdf

    本文将探讨Java软件开发中的常见误区。 首先,Java语言被认为过于复杂。这可能源于对Java语法和框架的不熟悉,以及对面向对象编程的理解不足。Java的设计理念是简洁和可维护,但初学者往往觉得其冗长的类库和繁琐的...

    人力成本的认识误区.doc

    人力成本的认识误区.doc

    组串式逆变器的历史及认识的误区.pdf

    浅谈组串式逆变器的历史及认识的误区

    Java习题(一些不注意就犯的错误)

    Java中的字符处理有时会让人困惑,比如字符编码、Unicode等。例如,Java使用Unicode编码,因此在处理特殊字符或非ASCII字符时需要注意。另外,字符与字符串的区别也很重要,字符用单引号括起来,字符串则用双引号。...

    Java自学编程误区.pdf

    ### Java自学编程误区知识点解析 #### 一、编程语言选择误区 - **纠结于语言的选择**:初学者往往会花费大量时间在选择编程语言上,比如是否应该选择PHP、Java、Python等,而不是专注于掌握一门语言的基础知识。 - ...

Global site tag (gtag.js) - Google Analytics