彻底搞定JAVA乱码问题来龙去脉(java如何处理乱码)

createh55个月前 (02-01)技术教程38

在从事JAVA软件程序开发过程中之所以遇到乱码,问题根本原因是解码和编码不一致造成的,比如将某字符串采用utf8编码存入txt,但是读出时却采用gbk,那么打印字符串时输出肯定是会出现乱码的。这个根本原因可能很多人都清楚,编写程序时可能也会指定编码写入和读出,但是还是少不了会遇到乱码问题,遇到时可能还会花不少时间解决。

本人最近就又因乱码栽了跟头,从10多年前入门java时便遇到过乱码问题,经过多年摸爬滚打,自认为对编码理解算是透彻了,没想到最近交付软件乱码竟然花了我大部分时间。交付客户的软件在我们本机已经测试多次,中文一直显示都非常正常,客户却说乱码,最后远程过去看了确实是乱码。又换2了台电脑时,我们仍然没有重现,最后没办法,还是老老实实检查代码,发现确实有个地方漏了指定编码,有潜在风险,至此花费时间还不算太多,但是奇怪的是给客户新版本,客户仍然坚持说乱码。埋头看代码,已经不可能发生的了,不可能了,不可能了,但是...。一遍一遍又看了多遍代码,真的不可能发生乱码了。最后我只能怀疑客户用错版本了,由于客户已经下班了,所以也没办法远程亲自试下。

感觉自己有点强迫症还是说责任心过头了,由于此次软件交付正好赶在了3天假期前,存在一点点问题,总像个石头压着心头,放松不得。于是又一遍遍捋下中文文字内容从存储文件中,加载到jvm内存,直到显示在界面一步步的过程,其实也只有2个关键位置,一时文件存储编码格式,一时读取时才有的解码格式,这2个地方我均采用确定的“utf8”,所以不可能再产生乱码。最后终于能99.9999%证明是客户的问题了,才算是放下心来。

最后整体总结下乱码相关编码点:

1.FileReader/FileWriter/Scanner,生成时需要指定,不指定使用系统默认编码,这样容易产生乱码,建议指定,本次栽跟头就是因为几处读写都指定了utf8,只有一处new Scanner是未指定导致[笑哭]惨痛教训铭记[敲打]。

2.jvm内存中变量值均采用unicode编码,比如“岳”字unicode编码为5cb3,当程序中定义一个字符串变量值为“岳”时,内存中是通过unicode静态编码表映射为5cb3的。

3.文件中编码,当在程序中定义中文字符串常量时,他们会随和文件采用相同编码进行保存,但是如果采用javac命令行进行编译时,一般都需要指定-encoding utf-8,否则会采用命令行默认编码,这时如果文件编码和命令行编码不一致便会出现编译失败或者中文乱码情况。

4.参数file.encoding,这个参数是用于修改IO读取和写入字符时所采用的默认编码的,不建议修改,但是这里容易遇到坑,所以在软件开发过程中需要留意。

相关文章

Servlet总结十三:程序乱码解决方案

乱码经常出现在什么位置数据保存过程中的乱码数据展示过程中的乱码数据传递过程中的乱码数据保存过程中的乱码数据保存到数据库表中的时候,数据出现乱码导致数据保存过程中的乱码包括以下两种情况:前一种情况:在保...

# mysql 中文乱码问题分析(#mysql表中文乱码)

# mysql 中文乱码问题分析## 一、问题分析:MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集,如 latin1、utf8、utf8mb4 等,如果在创建数据库、数...

乱码是怎么产生的?一“文”打尽乱码问题

在我们处理文件或者处理程序字符时,时不时会遇到乱码的情况,而且这些乱码的情况让人很困惑,大多时候都是CV某度一下,看看有没有相关类似情况的博文出现,如果有那就按照博文上的方式一步一步去解决就好,如果没...

5分钟课堂:输入输出汉字乱码的解决方法

从JDK 19升级到JDK 21和22之后,之前示例程序出现键盘输入的汉字在程序处理时乱码。具体现象:只要是键盘输入的汉字,不管是输出还是保存到文件,汉字都是乱码,而程序中的汉字字符串常量的输出和保存...

tomcat使用经验—解决windows中tomcat控制台输出中文乱码的问题

原文地址tomcat使用经验——解决windows中tomcat控制台输出中文乱码的问题 - 猿经验1 异常说明tomcat版本:tomcat-8.5.57在windows版本的tomcat中可以通过...

java安全编码指南之:异常处理(java安全编码规范考试题答案)

简介异常是java程序员无法避免的一个话题,我们会有JVM自己的异常也有应用程序的异常,对于不同的异常,我们的处理原则是不是一样的呢?一起来看看吧。异常简介先上个图,看一下常见的几个异常类型。所有的异...