如果我将一个字符转换为byte
然后回到char
,那个角色神秘地消失了,变成了别的东西。这怎么可能?
这是代码:
char a = 'È'; // line 1
byte b = (byte)a; // line 2
char c = (char)b; // line 3
System.out.println((char)c + " " + (int)c);
直到第 2 行一切都很好:
但是第 3 行出了什么问题呢? “c”变成别的东西,程序打印? 65480
。那是完全不同的事情。
为了得到正确的结果,我应该在第 3 行写什么?
Java 中的字符是 Unicode 代码单元,被视为无符号数。所以如果你执行c = (char)b
您得到的值为 2^16 - 56 或 65536 - 56。
或者更准确地说,该字节首先被转换为有符号整数,其值为0xFFFFFFC8
using 符号扩展在扩大转换中。然后这又被缩小到0xFFC8
当投射到char
,转换为正数65480
.
从语言规范来看:
5.1.4.扩大和缩小原始转换 https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.4
首先,通过加宽原语转换将字节转换为 int(第 5.1.2 节),
然后通过缩小原始转换将结果 int 转换为 char
(第 5.1.3 节)。
要获得正确的点,请使用char c = (char) (b & 0xFF)
首先将字节值转换为b
到正整数200
通过使用掩码,在转换后将前 24 位清零:0xFFFFFFC8
变成0x000000C8
或正数200
以小数表示。
上面是对之间转换过程中发生的情况的直接解释byte
, int
and char
原始类型。
如果您想从字节编码/解码字符,请使用Charset
, CharsetEncoder
, CharsetDecoder
或其中一种方便的方法,例如new String(byte[] bytes, Charset charset)
or String#toBytes(Charset charset)
。您可以从以下位置获取字符集(例如 UTF-8 或 Windows-1252):StandardCharsets
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)