java中字符编码转换核心是“先解码再编码”,即用原始编码将字符串转字节数组,再用目标编码重建字符串;string内部始终为utf-16,关键在字节与编码桥接准确;必须显式指定standardcharsets.utf_8等编码,禁用系统默认,避免filereader/printwriter无参构造引发乱码。

Java 中 String 处理字符编码转换,核心是“先解码再编码”——用原始编码把字符串转成字节数组,再用目标编码重新构造字符串。关键不在 String 本身(它内部始终是 UTF-16),而在于字节与编码之间的桥接是否准确。
明确指定编码,不依赖系统默认
Java 的 FileReader、PrintWriter 等类若不显式传入 Charset,会使用系统默认编码(Windows 常为 GBK,Linux/macOS 常为 UTF-8),极易导致乱码。
- 写文件时用
new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8) - 读文件时用
new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8) - 避免直接使用
new FileReader(f)或new FileWriter(f)
String 编码转换的正确写法
最常用也最易出错的操作是用 String.getBytes() 和 String(byte[], charset) 配合转换。必须确保第一个参数的编码与字符串原始来源一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 假设 str 原本是 GBK 编码的字节流解析而来,要转成 UTF-8 显示:
String utf8Str = new String(str.getBytes("GBK"), "UTF-8"); - 反向转换(如从 URL 参数 ISO-8859-1 解码中文):
String chinese = new String(param.getBytes("ISO-8859-1"), "UTF-8"); - 务必捕获
UnsupportedEncodingException,或直接使用StandardCharsets(JDK 7+ 推荐)
Web 场景下请求/响应编码统一
浏览器发来的请求体、URL 参数、响应内容,每一环都可能引入编码不一致。
- JSP 页面顶部声明:
- Servlet 中设置请求编码:
request.setCharacterEncoding("UTF-8");(仅对 POST 有效) - Tomcat 连接器配置:
URIEncoding="UTF-8"(解决 GET 请求中文参数乱码) - HTTP 响应头强制指定:
response.setContentType("text/html; charset=UTF-8");
数据库与外部数据源编码对齐
MySQL、Oracle 等数据库的连接、表结构、字段字符集需和 Java 应用层保持一致。
- JDBC URL 加参数:
?useUnicode=true&characterEncoding=UTF-8 - 建库建表时显式指定:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 避免用
ResultSet.getString()后再手动转码,应让驱动完成正确解码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










