一句话总结
面试模板
核心原理
1、char 的本质
- 16 位无符号整数,固定使用 UTF-16 编码。
- 能直接存储 Unicode 基本多语言平面(BMP,U+0000 ~ U+FFFF) 的字符:
- 常用汉字范围:U+4E00 ~ U+9FFF(如
char c = '你';)。 - 生僻字范围:U+10000 及以上(如
String s = "";,但char c = '';编译报错)。
- 常用汉字范围:U+4E00 ~ U+9FFF(如
2、文件编码(UTF-8/GBK)的作用
仅影响文件读取/写入:
- 正确读取:用匹配的编码解码(如
new String(bytes, "UTF-8")),char存的是 Unicode 字符。 - 错误读取:编码不匹配 → 乱码(如
没),但这是 数据错误,不是char能力问题。
3、字节流 → char 的转换
必须通过 Unicode 中转:
- 错误:直接合并字节(如 GBK 的
0xC4 0xE3→ 强行转char乱码)。 - 正确:
new String(bytes, charset)→toCharArray()安全。
测试代码
import java.nio.charset.StandardCharsets;
public class CharChineseDemo {
public static void main(String[] args) throws Exception {
// 常见汉字:1 个 char
char c1 = '你';
System.out.println("常见汉字: " + c1);
// 生僻字:必须用 String
// char c2 = ''; // 编译报错!
String s = "";
System.out.println("生僻字: " + s + " (长度=" + s.length() + ")"); // 长度=2(代理对)
System.out.println("生僻字:" + s.charAt(0)); // 乱码
// 文件编码:正确读取
byte[] utf8Bytes = "你".getBytes(StandardCharsets.UTF_8);
String str = new String(utf8Bytes, StandardCharsets.UTF_8);
char c3 = str.charAt(0);
System.out.println("UTF-8 读取: " + c3);
// 文件编码:错误读取(乱码)
String wrongStr = new String(utf8Bytes, "GBK");
char c4 = wrongStr.charAt(0);
System.out.println("UTF-8 误用 GBK 读取: " + c4); // 乱码(如 没)
}
}
关键对比表
| 场景 | 能否用 char | 原因 |
|---|---|---|
| 常用汉字(‘你’) | 可以 | Unicode ∈ BMP(U+4E00 ~ U+9FFF) |
| 生僻字(‘’) | 不可以 | Unicode ∉ BMP(需代理对) |
| UTF-8 文件正确读取 | 可以 | 解码后转为 UTF-16 的 char |
| UTF-8 文件误用 GBK 读 | 乱码 | 编码不匹配导致数据错误(不是 char 能力问题) |