网站首页 > 文章精选 正文
在从事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读取和写入字符时所采用的默认编码的,不建议修改,但是这里容易遇到坑,所以在软件开发过程中需要留意。
猜你喜欢
- 2025-01-23 Java程序员终极面试题(java程序员面试题库)
- 2025-01-23 人生中的第一个Java程序:HelloWorld
- 2025-01-23 面试必杀技:Jmeter性能测试攻略大全(第二弹)
- 2025-01-23 PATH系统环境变量配置教程【图文步骤】
- 2025-01-23 如何在Windows10中配置java的JDK环境
- 2025-01-23 java环境变量设置(java环境变量怎么设置)
- 2025-01-23 Java First Hello World 程序(hello world.java)
- 2025-01-23 Linux 下安装JDK17(linux如何安装jdk1.8)
- 2025-01-23 java编程、java学习:深刻理解Java编程的7个例子
- 2025-01-23 Java反编译工具JD-GUI、procyon-decompiler、luyten、crf简介
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)