java字符串编码转换核心在于unicode内部存储与外部字节交互的双向映射:字符串→字节数组为编码,字节数组→字符串为解码;必须严格匹配编码解码字符集,否则因字节解释错误导致乱码且不可逆。

Java 字符串编码转换面试题,核心是考察你对字符集、字节与字符串关系、以及常见乱码成因的理解,不是背代码,而是讲清楚“为什么这么转”和“不这么转会怎样”。下面从几个高频考点切入,直接说重点。
搞清 Java 字符串的存储本质
Java 内部所有 String 都用 Unicode(UTF-16)表示,char 是 16 位,String 对象本身不带编码信息。真正涉及编码的地方只有两个环节:字符串 → 字节数组(编码),字节数组 → 字符串(解码)。面试时如果只写 new String(bytes),没指定 charset,大概率被追问——因为用了平台默认编码,跨环境极易出错。
掌握最常用的转码写法(安全可靠)
推荐统一使用 StandardCharsets 枚举,避免字符串拼写错误和异常:
- GBK → UTF-8:new String(bytes, StandardCharsets.GBK).getBytes(StandardCharsets.UTF_8)
- UTF-8 → ISO-8859-1(比如处理某些 HTTP header):new String(bytes, StandardCharsets.UTF_8).getBytes(StandardCharsets.ISO_8859_1)
- 注意:不能直接 new String(bytes, "UTF-8") 然后 getBytes() 不带参数——后者会用系统默认编码,不可控
能解释典型乱码场景
比如这段代码为什么输出乱码?
String s = "你好";<br>byte[] gbkBytes = s.getBytes("GBK");<br>String wrong = new String(gbkBytes, "UTF-8"); // ❌ 用 UTF-8 解 GBK 编码的字节
原因:GBK 中“你好”是两个双字节(如 0xC4, 0xE3, 0xBA, 0xC3),UTF-8 解码器把这四个字节当成了两个非法 UTF-8 序列,替换为 或其他乱码。面试官想听的是“编码和解码必须用同一套规则,否则字节解释错,结果不可逆”。
知道什么时候该用 InputStreamReader/OutputStreamWriter
纯内存操作用 getBytes + new String 就够了;但读写文件或网络流时,必须用带 charset 的流包装器:
- new InputStreamReader(new FileInputStream("a.txt"), StandardCharsets.GBK)
- new OutputStreamWriter(new FileOutputStream("b.txt"), StandardCharsets.UTF_8)
- 这样能确保每次 read()/write() 都按指定编码处理,比先读成 byte[] 再手动转更安全、更符合 IO 语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











