Java中的字节和字符转换

新手上路,请多包涵

如果我将一个字符转换为 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 许可协议

阅读 360
1 个回答

Java 中的字符是 Unicode 代码单元,被视为无符号数字。所以如果你执行 c = (char)b 你得到的值是 2^16 - 56 或 65536 - 56。

或者更准确地说,字节首先被转换为一个带符号的整数,其值为 0xFFFFFFC8 在扩大转换中使用 _符号扩展_。这反过来又缩小到 0xFFC8 投射到 char 时,转换为正数 65480

从语言规范:

5.1.4.扩大和缩小原始转换

首先,通过扩大原始转换(§5.1.2)将字节转换为 int,然后通过缩小原始转换(§5.1.3)将生成的 int 转换为 char。


要获得正确的点,请使用 char c = (char) (b & 0xFF) 首先将 b 的字节值转换为正整数 200 转换后使用顶部掩码 24 位置零: 0xFFFFFFC8 变为 0x000000C8 或正数 200 小数。


以上直接解释了 byteintchar 原始类型之间的转换过程。

If you want to encode/decode characters from bytes, use Charset , CharsetEncoder , CharsetDecoder or one of the convenience methods such as new String(byte[] bytes, Charset charset)String#toBytes(Charset charset) 。您可以从 StandardCharsets 获取字符集(例如 UTF-8 或 Windows-1252)。

原文由 Maarten Bodewes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题