Java 中文乱码怎么解决

你有没有在写Java程序时遇到过这样的情况:明明写的是“你好,世界”,运行后控制台却吐出一堆乱码问号;或者把数据存进数据库,再读出来时变成了看不懂的方块字?这种“明明是中文却变成乱码”的问题,就是Java开发里很常见的“中文乱码”,今天咱们就用生活化的例子,把这个问题拆解开,看看怎么彻底解决它。

为什么会出现中文乱码?

要解决问题,得先搞懂根源。其实乱码就像“翻译错了话”——咱们平时说的中文,是用“汉字”组成的;而计算机只认“编码表”里的数字,比如“你”这个字,在UTF-8编码里是3个数字,在GBK里是2个数字。如果把A编码的字,用B编码去读,就像把英文书直接用中文字典翻,肯定会出错。

Java 中文乱码怎么解决

举个日常例子:你用微信发消息,自己手机是“UTF-8”编码,对方手机如果设成了“GBK”,消息就会变乱码。Java里的乱码本质是一样的——程序里的中文、输入输出的文件、连接的数据库,各自用的编码不一样,就像大家说不同语言却硬要聊天,最后只能变成“鸡同鸭讲”。

最常见的3种Java乱码场景及解决方法

Java中文乱码不是单一问题,不同场景有不同的解决办法,咱们挑日常开发里最容易踩坑的3种说:

控制台输出的中文乱码

写Java程序时,你在System.out.println里写“你好”,运行后却显示乱码,大概率是控制台的编码和程序编码不匹配。比如Windows的CMD默认用GBK,而IntelliJ IDEA这类开发工具默认用UTF-8。

解决方法很简单:如果用CMD运行,先把CMD的编码改成UTF-8,输命令chcp 65001(这是UTF-8的代码页)再运行程序;如果用IDEA,去“File→Settings→Editor→File Encodings”,把所有编码都设成UTF-8,保存后重启工具就行。

读写文件时的中文乱码

把Java里的中文写到TXT文件,或者从TXT里读中文时乱码,是因为流的编码没设对。比如你用FileWriter写文件,默认用系统编码(Windows是GBK),如果文件要给其他系统用(比如Mac),就会乱码。

正确做法是指定编码:比如用Java 8的Files工具类,写文件时加StandardCharsets.UTF_8参数,代码写成Files.write(Paths.get("test.txt"), "你好".getBytes(StandardCharsets.UTF_8));,读的时候也用同一个编码,这样不管在哪个系统,中文都不会乱。

连接数据库时的中文乱码

这是后端开发里最头疼的乱码——把Java里的中文存进MySQL,读出来却是问号。很多人会以为是代码的问题,其实是数据库的编码没设对。MySQL默认的老版本用Latin1编码,根本存不了中文。

解决分两步:第一步,创建数据库时就指定UTF-8,比如CREATE DATABASE mydb CHARACTER SET utf8mb4;(utf8mb4比普通UTF-8多了生僻字的支持);第二步,Java连接数据库的URL里加编码参数,比如jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8mb4,这样Java和数据库就用同一种编码,不会出错。

给新手的避坑小提醒

很多新手会踩的一个误区:“我在每个地方都设了UTF-8,怎么还是乱码?”其实要注意“编码的一致性”——从代码文件→编译后的class文件→控制台→文件→数据库,整个流程的编码必须是统一的,就像接力赛,每个选手都用同一种语言,最后才能准确传递信息。

还有个小技巧:如果不确定当前用的编码,可以在Java代码里加一行System.out.println(System.getProperty("file.encoding"));,就能看到系统默认编码,对照着把所有环节改成UTF-8,基本能解决90%的乱码问题。

其实Java中文乱码不是什么高深的技术问题,本质就是“编码不统一”的小误会,只要抓住“所有环节用同一种编码”这个核心,再对应不同场景调整,就能轻松搞定。下次再遇到乱码,别着急,先检查一遍每个环节的编码设置就好啦。

上一篇 PHP 504 错误怎么解决