解决开发中字符编码中文显示乱码问题的N个方法
如果是自己开发从0到1,基本上是不会出现字符编码集错误遇到乱码的问题。
常出现在导入项目的时候,有可能源项目用的是GBK,而你用的是utf-8,那么就会出现乱码问题。
一般出现的地方都是用中文注释的字段最容易出现问题。经常因为字符编码的问题出现乱码,造成无法阅读。
常用的字符编码无非就这几种:
百度百科有详细介绍
1、GBK
2、UTF-8
3、ANSI
4、Unicode
5、UTF-8+BOM
6、Base64
想了解编码发展史和各个编码集之间的差异可以参考
http://www.qianxingzhem.com/post-1499.html
里面说的很详细,可读性比较强。
而我们经常遇到的错误大概也是GBK和UTF-8产生的冲突。
常规修改
如果是编写安卓程序,或者html,我们可以用EditPlus,或者其他一些第三方编辑器都可以更改字符编码格式。
拿Editplus来说,打开Java文件之后,在窗口下面能看到字符编码格式,双击就可以选择修改,修改完之后保存(ctrl+s)。或者File->save as->选择要保存的字符编码格式->Y是,覆盖源文件即可。
这里需要注意的是默认的编码是ANSI,也就是本地操作系统默认的内码。
有些第三方编辑器里的GBK是叫GB2312,一般编辑器里只显示几个常用的,需要其他的编码需要点击更多查找。
IDEA修改
但是如果是Java桌面程序,这种方法似乎就没那么好用了,如果转换后,在IDE中显示正常,能正常看,但是一运行编译,桌面上还是乱码。
去网上搜了一下说是Java虚拟机字符编码集的问题,
于是在main方法中执行了一下
System.getProperties().list(System.out);
然后控制台打印了下面的结果
"D:\Program Files\Java\jdk1.8.0_11\bin\java" -Didea.launcher.port=7532
"-Didea.launcher.bin.path=F:\JetBrains\IntelliJ IDEA 2016.3.3\bin" -
2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain
·······
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Program Files\Java\jdk1.8.0_11\jre...
java.vm.version=25.11-b03
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
idea.launcher.port=7532
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 1
java.vm.specification.name=Java Virtual Machine Specification
user.dir=G:\IdeaProjects\chat-room-JFrame
java.runtime.version=1.8.0_11-b12
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Program Files\Java\jdk1.8.0_11\jre...
os.arch=amd64
java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
java.library.path=D:\Program Files\Java\jdk1.8.0_11\bin...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.1
user.home=C:\Users\Administrator
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.awt.windows.WPrinterJob
java.specification.version=1.8
file.encoding=UTF-8
idea.launcher.bin.path=F:\JetBrains\IntelliJ IDEA 2016.3.3\bin
user.name=Administrator
java.class.path=D:\Program Files\Java\jdk1.8.0_11\jre...
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=D:\Program Files\Java\jdk1.8.0_11\jre
sun.java.command=com.intellij.rt.execution.application...
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_11
java.ext.dirs=D:\Program Files\Java\jdk1.8.0_11\jre...
sun.boot.class.path=D:\Program Files\Java\jdk1.8.0_11\jre...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64
Process finished with exit code 0
一共有三个地方提到了编码集。拆分来看:
1、这里是java.vm包也就是JVM虚拟机,字面意思就是规范,也可以理解为运行规则。
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
2、是打印控制台的配置
java.awt.printerjob=sun.awt.windows.WPrinterJob
java.specification.version=1.8
file.encoding=UTF-8
3、供应商的url地址。(Unicode兼容UTF-8、UTF-7)
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
分析之后结果就已经出来了。问题就出在jvm运行时出现编码问题。
把项目中的源码修改成jvm运行时的编码即可。
Java项目源码中强转
使用Java自带的gitByte方法进行转换,前者是当前格式,后者是要转换的格式
new String(str.getByte("GB2312"),"UTF-8")
最后
如果还是没有效果那么就只能用最后一个暴力办法了,把源码重新拷贝剪切。
总结了一下几个开发过程中遇到的字符编码问题。还不够全面,欢迎留言补充。