美文网首页JavaAndroid知识Java学习笔记
解决开发中字符编码中文显示乱码问题的N个方法

解决开发中字符编码中文显示乱码问题的N个方法

作者: 八怪不姓丑 | 来源:发表于2017-02-04 15:57 被阅读149次

    如果是自己开发从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")

    最后

    如果还是没有效果那么就只能用最后一个暴力办法了,把源码重新拷贝剪切。


    总结了一下几个开发过程中遇到的字符编码问题。还不够全面,欢迎留言补充。

    相关文章

      网友评论

        本文标题:解决开发中字符编码中文显示乱码问题的N个方法

        本文链接:https://www.haomeiwen.com/subject/ucijittx.html