美文网首页
Java程序员遇上字符乱码11-字符和字节转化

Java程序员遇上字符乱码11-字符和字节转化

作者: _Danniel_ | 来源:发表于2017-08-22 08:49 被阅读0次

由上一遍文章可知,Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码(2 字节或 4字节)。2 字节字符,可以存放到char类型变量,而且UTF-16格式码值和Unicode字符表序号“长得一样” ;如果一个偏僻的字符在 UTF-16 编码下占 4 字节,显然它是不能存放到 char 中的。换言之, char 中只能放 UTF-16 编码下只占 2 字节的那些字符。4字节字符就只能用两个char合起来的char数组表达了。

char 和 int 互转化剖析

int 数值大小在2^16内:char 和 int 直接互转化。int数值(四字节)会被截断高位两个字节的空间,可是数值大小不变,因为没有影响低位两个字节的值。

剖析:0xD307 小于 2^16,因此属于Unicode字符中的两字节字符。Unicode字符中的两字节字符 的索引序号(即代码点) 和 Utf-16字符编码值“长得一样”。一个char字符,想要获取其代码点,则直接强制转化为int即可。

不过为何出现下面的情况,我也是不清楚:如果说两字节字符的Utf-16字符编码值  和 Unicode代码点一致的话,为何bytes数组会是4个?还会出现负数?

int 数值大于2^16:int(四字节,代码点)不能直接转化char(两字节)。因为强制转化会自动截断空间,只取int数值的低位的两个字节;其次,int-->char过程中,其实存在转化高低代理位的算法(见java.lang.Character#highSurrogate和java.lang.Character#lowSurrogate)。因此,当 得到的char数组中的char也不是 原来int的高/低16位。要想得到char数组对应的Unicode字符表序号(即代码点),则需要通过String.codePointAt(int);

1)我们尝试将四字节int强转化成char:你会发现char变量对应的数值是0xD307。高位0x1已经被自动截掉丢失。所以这样强制转化是错误的。

2)四字节字符,我们是要利用Character.toChars(int)来转化的:

相关文章

  • Java程序员遇上字符乱码11-字符和字节转化

    由上一遍文章可知,Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码...

  • Java程序员遇上字符乱码12-字符和字节数组

    小白们在不同平台上使用String.getBytes(),会发现同样的字符得到的字节数组不同样。明显这是依赖于平台...

  • java中的I/O流系统详解

    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符...

  • Java IO详解

    1. Java中字节流和字符流 字节(Byte)和字符(Character)的大小: 1 byte = 8bit[...

  • Java的IO操作

    Java的文件IO操作: 有两种形式:字节流和字符流,字节流传输的是字节,返回的也是字节,而字符流传输的是字符,返...

  • 文件编码

    编码:字符转为字节解码:字节转为字符 字符集:JAVA字符使用16位的双字节存储,但是在实际文件存储的数据有各种字...

  • IO Stream - 字符流

    字符流 字符流出现的原因1.字符流介绍:由于字节流操作中文不是特别方便,所以Java提供了字符流字符流 = 字节流...

  • Java IO和NIO

    Java IO Java IO面向流,按照流中的最小数据单元可以分为字节流和字符流,顾名思义分别以字节和字符作为数...

  • java:字节和字符

    记录并分享下自己学习时的小插曲。 事情起源:java基础太次了,就打算,重新学一遍,再做做题。于是乎就碰见了这么道...

  • Java 字符和字节

    字符:一个人类文字的单位。 字节:一个计算机数据单位。由8个bit组成 字符就是人类看得懂的文字 字节就是计算机看...

网友评论

      本文标题:Java程序员遇上字符乱码11-字符和字节转化

      本文链接:https://www.haomeiwen.com/subject/uvykdxtx.html