如果我将一个字符转换为 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 行,一切都很好:
在第 1 行中,我可以在控制台中打印“a”,它会显示“È”。
在第 2 行中,我可以在控制台中打印“b”,它会显示 -56,即 200,因为字节已签名。而 200 是“È”。所以还是可以的。
但是第 3 行有什么问题呢? “c”变成其他东西,程序打印 ? 65480
。那是完全不同的东西。
为了得到正确的结果,我应该在第 3 行写什么?
原文由 user1883212 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 中的字符是 Unicode 代码单元,被视为无符号数字。所以如果你执行
c = (char)b
你得到的值是 2^16 - 56 或 65536 - 56。或者更准确地说,字节首先被转换为一个带符号的整数,其值为
0xFFFFFFC8
在扩大转换中使用 _符号扩展_。这反过来又缩小到0xFFC8
投射到char
时,转换为正数65480
从语言规范:
5.1.4.扩大和缩小原始转换
要获得正确的点,请使用
char c = (char) (b & 0xFF)
首先将b
的字节值转换为正整数200
转换后使用顶部掩码 24 位置零:0xFFFFFFC8
变为0x000000C8
或正数200
小数。以上直接解释了
byte
、int
和char
原始类型之间的转换过程。If you want to encode/decode characters from bytes, use
Charset
,CharsetEncoder
,CharsetDecoder
or one of the convenience methods such asnew String(byte[] bytes, Charset charset)
或String#toBytes(Charset charset)
。您可以从StandardCharsets
获取字符集(例如 UTF-8 或 Windows-1252)。