Java中字符编码核心API围绕String、Charset及InputStreamReader/OutputStreamWriter展开,关键在于明确字节与字符转换的边界:String本质是UTF-16 Unicode序列,无自带编码;byte[]与String互转必须显式指定Charset(如StandardCharsets.UTF_8),避免平台默认编码导致乱码。

Java 中字符编码的核心 API 主要围绕 String、Charset、InputStreamReader/OutputStreamWriter 以及 java.nio.charset 包展开。熟练调用的关键不是死记方法,而是理解“字节 ↔ 字符”转换的边界和责任归属——谁在何时做了什么编码/解码。
明确字符串本质:String 是 Unicode 字符序列,不带编码
Java 的 String 内部以 UTF-16 表示,它本身没有“编码”。所谓“String 的编码”,实际是指它与字节数组(byte[])相互转换时所用的字符集。常见误区是写:
❌ String s = new String(bytes); // 默认平台编码,不可靠
正确做法必须显式指定 Charset:
String s = new String(bytes, StandardCharsets.UTF_8);byte[] bytes = s.getBytes(StandardCharsets.UTF_8);- 优先使用
StandardCharsets.UTF_8(JDK 7+),避免用字符串名如"UTF-8"(可能抛UnsupportedEncodingException)
文件读写:用带 Charset 的 NIO.2 或包装流
传统 FileReader/FileWriter 强制使用平台默认编码,极易出错。应绕过它们:
- 写文件:
Files.write(path, content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); - 读文件:
String content = Files.readString(path, StandardCharsets.UTF_8);(JDK 11+) - 兼容旧版:
new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) - 写文本流:
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))
网络与 I/O:协议层决定编码,API 层负责显式声明
HTTP 响应头 Content-Type: text/html; charset=UTF-8、数据库连接 URL 中的 useUnicode=true&characterEncoding=UTF-8,这些才是源头。Java API 只是忠实执行:
立即学习“Java免费学习笔记(深入)”;
- JDBC:URL 加参数,Driver 自动用该编码处理
ResultSet.getString()和PreparedStatement.setString() - HttpClient:响应体需手动按 header 指定的 charset 解码:
EntityUtils.toString(response.getEntity(), charset) - Servlet:用
request.setCharacterEncoding("UTF-8")处理 POST 表单;response.setCharacterEncoding("UTF-8")设置响应编码
调试编码问题:三步定位法
出现乱码时,不要猜,分段验证:
- 查原始字节:用
Arrays.toString(bytes)看二进制是否符合预期(如 UTF-8 中中文通常是 3 字节序列-26 -120 -111) - 查中间字符串:打印
s.codePoints().forEach(System.out::println)看 Unicode 码点是否正确(如 '中' 是20013) - 查最终输出:确认终端、IDE 控制台、浏览器等接收方是否支持并启用了对应编码(例如 IntelliJ 默认用 UTF-8,Windows CMD 默认 GBK)


















