为了账号安全,请及时绑定邮箱和手机立即绑定

Java 2个字节的字符大小不是吗?

Java 2个字节的字符大小不是吗?

拉丁的传说 2019-11-25 15:02:57
我RandomAccessFile以前是byte从文本文件中读取的。public static void readFile(RandomAccessFile fr) {    byte[] cbuff = new byte[1];    fr.read(cbuff,0,1);    System.out.println(new String(cbuff));}为什么我看到一个完整的字符被读取?
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

char表示Java (*)中的字符。它长2个字节(至少这是有效值范围所建议的大小)。

这并不一定意味着一个字符的每个表示都长2个字节。实际上,许多编码只为每个字符保留1个字节(或为最常见的字符使用1个字节)。

当调用String(byte[])构造函数你问的Java的转换byte[]String使用平台默认的编码。由于平台默认编码通常是1字节编码(例如ISO-8859-1)或可变长度编码(例如UTF-8),因此它可以轻松地将1字节转换为单个字符。

如果您在使用UTF-16(或UTF-32或UCS-2或UCS-4或...)作为平台默认编码的平台上运行该代码,则将不会得到有效的结果(您会得到一个String含有Unicode替换字符代替)。

这就是为什么您不应该依赖平台默认编码的原因之一:在byte[]char[]String或之间InputStream以及和Reader或之间OutputStream以及和之间进行转换时Writer,应始终指定要使用的编码。如果您不这样做,那么您的代码将取决于平台。

(*)并非完全正确:a char代表UTF-16代码点。任一个2 UTF-16的码点代表一个Unicode码点。Unicode代码点通常表示一个字符,但有时使用多个Unicode代码点组成一个字符。但是上面的近似值足够接近讨论当前的话题。


查看完整回答
反对 回复 2019-11-25
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

Java在内部将所有“字符”存储为两个字节。但是,当它们变成字符串等时,字节数将取决于您的编码。


一些字符(ASCII)是单字节,但是其他一些字符是多字节。


Java支持Unicode,因此根据:


Java字符文档


支持的最大值是“ \ uFFFF”(十六进制FFFF,十进制65535)或11111111 11111111二进制(两个字节)。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 500 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信