java能正确处理中文字符的关键是使用unicode编码的char和string类型,并在i/o操作时显式指定utf-8等字符集;char基于utf-16,string逻辑上也以utf-16为基础,乱码主因是编解码环节未统一编码。

用 char 和 String 直接写中文没问题
只要源文件保存为 UTF-8(现代 IDE 默认),Java 编译器会正确识别并转为 UTF-16 存入 class 文件:
- char c = '中'; —— 合法,'中' 的 Unicode 码点是 U+4E2D,在 UTF-16 中占 1 个 char
- String s = "你好世界"; —— 完全正常,String 本身不关心“编码”,它按 Unicode 逻辑操作字符
- 注意:不能用 byte 存中文字符(除非明确知道编码且手动转换),比如
byte b = '中'会编译失败或截断
文件读写必须显式指定字符集
从文本文件、网络流读取或写入中文时,若不指定编码,会使用平台默认 charset(Windows 上常为 GBK,Linux/macOS 多为 UTF-8),极易乱码:
- 写入文件:
Files.write(path, "中文".getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); - 读取文件:
String s = Files.readString(path, StandardCharsets.UTF_8); - 用 Scanner 读文件:
new Scanner(file, "UTF-8") - 用 InputStreamReader:
new InputStreamReader(inputStream, "UTF-8")
与外部系统交互要约定编码
HTTP 请求头、数据库连接、序列化格式等都需统一编码策略:
- HTTP 响应头加
Content-Type: text/html; charset=UTF-8 - JDBC URL 加参数:
?useUnicode=true&characterEncoding=UTF-8(MySQL) - JSON 库(如 Jackson)默认用 UTF-8,无需额外配置;但若手动转 byte[],记得用
"UTF-8" - 避免使用过时的
String.getBytes()(无参)或new String(byte[])(无参),它们依赖系统默认编码
调试乱码先查三处
出现中文显示为 ? 或方块时,快速定位:
- 源代码文件实际保存编码(IDE → File Encoding,确认是 UTF-8)
- 控制台/终端是否支持 UTF-8(Windows cmd 默认不支持,可用 PowerShell 或改注册表)
- 所有 I/O 操作是否显式传入
StandardCharsets.UTF_8或"UTF-8"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











