默认编码非万能解药,须显式指定UTF-8:JVM启动加-Dfile.encoding=UTF-8,文件I/O、网络请求、控制台输出、日志均需显式声明Charset,禁用无参String.getBytes()等隐式依赖默认编码的操作。

搞清默认编码不是万能解药
Java 运行时的默认字符编码(file.encoding)由启动环境决定,不是代码里写个 Charset.defaultCharset() 就能高枕无忧。它可能在 IDE、终端、Docker 容器、Linux 系统 locale 之间来回漂移——同一段读文件代码,在 macOS 上正常,在 CentOS 容器里突然乱码,十有八九是这个原因。
建议:
• 启动 JVM 时显式指定: -Dfile.encoding=UTF-8
• 关键 I/O 操作不依赖默认编码,一律用带 charset 参数的构造器或方法,例如:
new InputStreamReader(inputStream, StandardCharsets.UTF_8)
Files.readString(path, StandardCharsets.UTF_8)
• 避免使用 String.getBytes() 或 new String(byte[]) 这类无参重载,它们隐式调用默认编码,极易翻车。
文件读写必须声明编码,别信“系统自动识别”
Java 不会自动探测文件编码。用 FileReader 或 Scanner(new File(...)) 等不带 charset 的 API,底层全走默认编码,一旦文件实际是 GBK 或 ISO-8859-1,读出来就是一堆问号或乱码字节。
正确姿势:
• 优先用 Files.readAllLines(path, charset)、Files.writeString(path, content, charset)(JDK 11+)
• JDK 8 及以前,用 Files.newBufferedReader(path, charset) 和 Files.newBufferedWriter(path, charset)
• 临时兼容旧代码?至少把 FileReader 换成 InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8)
网络请求和 JSON 解析最容易漏掉编码
HTTP 响应体没声明 Content-Type: text/plain; charset=GBK?JSON 字符串含中文但解析器没设 charset?这些地方一疏忽,response.getBody() 或 new JSONObject(str) 就可能把 UTF-8 字节错当平台默认编码解,结果中文变方块。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
关键检查点:
• Spring RestTemplate:配置 StringHttpMessageConverter 并 setSupportedMediaTypes,明确支持 text/*;charset=UTF-8
• OkHttp / HttpClient:设置 request header Accept-Charset: utf-8,读响应时用 response.body().string()(OkHttp 自动按 header 或 BOM 推断)或手动指定 charset
• JSON 库如 Jackson:反序列化前确认输入流已用正确 charset 包装;若传入字符串,确保该字符串本身是从正确编码的字节构建而来
控制台输出和日志也受编码影响
System.out.println("你好") 在 Windows CMD 里显示为乱码?不是代码错了,是终端不认 UTF-8。JVM 输出流会按 file.encoding 编码字节,但 CMD 默认用 GBK 解码——两边对不上,自然糊。
应对办法:
• 开发阶段:IDE 控制台统一设 UTF-8(IntelliJ:Settings → Editor → File Encodings;Eclipse:Preferences → General → Workspace → Text file encoding)
• 生产环境:Linux 终端确保 LANG=en_US.UTF-8;Windows 若必须用 CMD,可加 chcp 65001 切换到 UTF-8 模式(需 Java 9+ 支持)
• 日志框架(Logback/Log4j):在 appender 配置中显式指定 charset="UTF-8",避免日志文件本身编码混乱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










