java - Java中字符的大小不是2字节吗?

标签 java string char

我使用 RandomAccessFile 从文本文件中读取 byte

public static void readFile(RandomAccessFile fr) {
    byte[] cbuff = new byte[1];
    fr.read(cbuff,0,1);
    System.out.println(new String(cbuff));
}

为什么我看到一个完整的字符被它读取?

最佳答案

一个 char表示 Java (*) 中的一个字符。它是 2 字节大(或 16 位)。

这并不一定意味着一个字符的每个表示都是 2 个字节长。其实很多character encodings只为每个字符保留 1 个字节(或为最常见的字符使用 1 个字节)。

当您调用 the String(byte[]) constructor 时您要求 Java 转换 byte[]String使用 platform's default charset (**)。由于平台默认字符集通常是 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代码单元。 onetwo UTF-16 代码单元代表 Unicode码点。一个 Unicode 码点通常代表一个字符,但有时多个 Unicode 码点用于组成一个字符。但是上面的近似值已经足够接近讨论手头的话题了。

(**) 请注意,在 Android 上,默认字符集是 always UTF-8从 Java 18 开始,Java 平台本身也是 switched to this default (但仍然可以是 configured to act the legacy way )

关于java - Java中字符的大小不是2字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078314/

相关文章:

java - Jasper 服务器上的自定义 Jar 文件

c++ - 将 basic_string<unsigned char> 转换为 basic_string<char> ,反之亦然

string - 使用两个函数与一个函数进行散列

java - 比较时忽略 char 的大写和小写

c++ - 在 C++ 中将二进制 Char 数组转换为整数和 double 组

java - 循环StringBuilder内存泄漏

java - 从java中的gradle.properties访问属性?

java - 为什么 XmlJavaTypeAdapter 在父类中被忽略

c++ - C字符串函数的实现

Swift 3 不正确的字符串插值与隐式展开的 Optionals