如果是自己開發(fā)從0到1陈莽,基本上是不會(huì)出現(xiàn)字符編碼集錯(cuò)誤遇到亂碼的問題汗捡。
常出現(xiàn)在導(dǎo)入項(xiàng)目的時(shí)候,有可能源項(xiàng)目用的是GBK脸侥,而你用的是utf-8建邓,那么就會(huì)出現(xiàn)亂碼問題。
一般出現(xiàn)的地方都是用中文注釋的字段最容易出現(xiàn)問題睁枕。經(jīng)常因?yàn)樽址幋a的問題出現(xiàn)亂碼官边,造成無法閱讀沸手。
常用的字符編碼無非就這幾種:
百度百科有詳細(xì)介紹
1、GBK
2注簿、UTF-8
3契吉、ANSI
4、Unicode
5诡渴、UTF-8+BOM
6捐晶、Base64
想了解編碼發(fā)展史和各個(gè)編碼集之間的差異可以參考
http://www.qianxingzhem.com/post-1499.html
里面說的很詳細(xì),可讀性比較強(qiáng)妄辩。
而我們經(jīng)常遇到的錯(cuò)誤大概也是GBK和UTF-8產(chǎn)生的沖突惑灵。
常規(guī)修改
如果是編寫安卓程序,或者h(yuǎn)tml眼耀,我們可以用EditPlus英支,或者其他一些第三方編輯器都可以更改字符編碼格式。
拿Editplus來說畔塔,打開Java文件之后潭辈,在窗口下面能看到字符編碼格式,雙擊就可以選擇修改澈吨,修改完之后保存(ctrl+s)把敢。或者File->save as->選擇要保存的字符編碼格式->Y是,覆蓋源文件即可谅辣。
這里需要注意的是默認(rèn)的編碼是ANSI,也就是本地操作系統(tǒng)默認(rèn)的內(nèi)碼修赞。
有些第三方編輯器里的GBK是叫GB2312,一般編輯器里只顯示幾個(gè)常用的,需要其他的編碼需要點(diǎn)擊更多查找桑阶。
IDEA修改
但是如果是Java桌面程序柏副,這種方法似乎就沒那么好用了,如果轉(zhuǎn)換后蚣录,在IDE中顯示正常割择,能正常看萎河,但是一運(yùn)行編譯荔泳,桌面上還是亂碼。
去網(wǎng)上搜了一下說是Java虛擬機(jī)字符編碼集的問題虐杯,
于是在main方法中執(zhí)行了一下
System.getProperties().list(System.out);
然后控制臺(tái)打印了下面的結(jié)果
"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
一共有三個(gè)地方提到了編碼集玛歌。拆分來看:
1、這里是java.vm包也就是JVM虛擬機(jī)擎椰,字面意思就是規(guī)范支子,也可以理解為運(yùn)行規(guī)則。
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
2达舒、是打印控制臺(tái)的配置
java.awt.printerjob=sun.awt.windows.WPrinterJob
java.specification.version=1.8
file.encoding=UTF-8
3值朋、供應(yīng)商的url地址叹侄。(Unicode兼容UTF-8、UTF-7)
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
分析之后結(jié)果就已經(jīng)出來了吞歼。問題就出在jvm運(yùn)行時(shí)出現(xiàn)編碼問題圈膏。
把項(xiàng)目中的源碼修改成jvm運(yùn)行時(shí)的編碼即可。
Java項(xiàng)目源碼中強(qiáng)轉(zhuǎn)
使用Java自帶的gitByte方法進(jìn)行轉(zhuǎn)換,前者是當(dāng)前格式篙骡,后者是要轉(zhuǎn)換的格式
new String(str.getByte("GB2312"),"UTF-8")
最后
如果還是沒有效果那么就只能用最后一個(gè)暴力辦法了稽坤,把源碼重新拷貝剪切。
總結(jié)了一下幾個(gè)開發(fā)過程中遇到的字符編碼問題糯俗。還不夠全面尿褪,歡迎留言補(bǔ)充。