這篇文章將為大家詳細(xì)講解有關(guān)Java在linux下出現(xiàn)亂碼的原因和解決方法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供石阡網(wǎng)站建設(shè)、石阡做網(wǎng)站、石阡網(wǎng)站設(shè)計(jì)、石阡網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、石阡企業(yè)網(wǎng)站模板建站服務(wù),10多年石阡做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
a)基于awt(swing)的圖形界面程序中文顯示亂碼
基于awt(swing)的圖形界面程序中,一般會(huì)出現(xiàn)菜單中的中文顯示亂碼,其原因一般是JVM找不到用來(lái)顯示中文的字庫(kù),JVM在原始的安裝下是沒(méi)有中文字庫(kù)的,而linux的發(fā)行版本又各不相同,其字庫(kù)存放的路徑和名字又各不相同,所以JVM一般是找不到linux操作系統(tǒng)內(nèi)帶的字庫(kù),解決方法是讓JVM能找到linux操作系統(tǒng)內(nèi)帶的字庫(kù),如在Redflag 6.0下可以通過(guò)下面命令解決:
mkdir /usr/java/jdk1.6.0/jre/lib/fonts/fallback ln -s /usr/share/fonts/chinese/TrueType/*.ttf /usr/java/jdk1.6.0/jre/lib/fonts/fallback
一般不需要修改JRE/lib/目錄下的字體配置文件(fontconfig.OS.Version.properties)。
b)基于B/S結(jié)構(gòu)的JSP(Servlet)的系統(tǒng)用戶端瀏覽器中文顯示亂碼
頁(yè)面中的中文顯示亂碼
對(duì)于像HTML的靜態(tài)文件,其文件的字符集只要和文件中處所設(shè)置的一樣即可。
對(duì)于像JSP和Servlet動(dòng)態(tài)文件由于需要經(jīng)過(guò)編譯,在運(yùn)行是由JVM解釋class文件而產(chǎn)生用戶端瀏覽器所需的HTML文件,如果產(chǎn)生中文亂碼,則一般是由編譯和運(yùn)行過(guò)程中產(chǎn)生的。如果用商用的發(fā)行版Linux和服務(wù)器,一般只要將JSP或Servlet文件保存為UTF-8字符集,將中設(shè)置為UTF-8即可。如果還出現(xiàn)亂碼則可以通過(guò)以下方法解決:
①如果服務(wù)器是自主研發(fā)的,可以通過(guò)修改源代碼,指定JVM讀文件、寫文件以及生成用戶端瀏覽器所需的HTML文件時(shí),字符串與二進(jìn)制序列流轉(zhuǎn)換時(shí)的編碼方式,從而從根本上解決問(wèn)題,增強(qiáng)服務(wù)器的適應(yīng)性,在MyWebServer 2.0中,我就采用了這種方法,代碼如下:
new BufferedReader(new InputStreamReader(new FileInputStream(jspfile),”GBK”)); new PrintWriter(serfile,”GBK”); new PrintWriter(new OutputStreamWriter(os,”GBK”));
②當(dāng)然也可以在服務(wù)器的入口文件(即含有main子函數(shù)的文件)中修改JVM的“l(fā)ocale”設(shè)置,代碼如下:
Locale.setDefault(new Locale(“zh”,”CN”));
③當(dāng)采用商用服務(wù)器時(shí),可以修改啟動(dòng)服務(wù)器的shell文件,在啟動(dòng)服務(wù)器前設(shè)置環(huán)境變量“export LC_ALL=zh_CN.UTF-8”,從而改變本控制臺(tái)下默認(rèn)的“l(fā)ocale”值。
④當(dāng)然也可以修改操作系統(tǒng)的“l(fā)ocale”設(shè)置,但由于修改操作系統(tǒng)的“l(fā)ocale”設(shè)置將會(huì)影響到其他應(yīng)用程序,所以一般采用該方法。
采用上述方法的主要原因是,當(dāng)JVM在首次起動(dòng)時(shí),將會(huì)把操作系統(tǒng)的“l(fā)ocale”設(shè)置為JVM的默認(rèn)“l(fā)ocale”,在操作系統(tǒng)沒(méi)有設(shè)置“l(fā)ocale”值時(shí),JVM將會(huì)把JVM的缺省的“l(fā)ocale”設(shè)置為JVM的默認(rèn)“l(fā)ocale”,當(dāng)然也可以在運(yùn)行應(yīng)用程序時(shí)修改JVM的默認(rèn)“l(fā)ocale”設(shè)置,在JVM進(jìn)行字符串與二進(jìn)制序列流相互轉(zhuǎn)換時(shí),如果指定了編碼方式,將以指定的編碼方式轉(zhuǎn)換,否則根據(jù)JVM的默認(rèn)“l(fā)ocale”進(jìn)行轉(zhuǎn)換。
結(jié)論
Java語(yǔ)言在linux下中文顯示產(chǎn)生的亂碼,主要與JVM的字庫(kù)、操作系統(tǒng)的locale設(shè)置、JVM的默認(rèn)locale設(shè)置、應(yīng)用程序中的locale設(shè)置以及應(yīng)用程序中直接指定的二進(jìn)制序列流與字符串轉(zhuǎn)化的字符集有關(guān)。是由于二進(jìn)制序列流和字符串相互轉(zhuǎn)化過(guò)程中所采用的字符編碼方式不同或者JVM找不到所需要的字庫(kù)所致,可以采取不同的方法去解決,具體采用哪種方法處理還要結(jié)合具體的應(yīng)用環(huán)境。
關(guān)于Java在linux下出現(xiàn)亂碼的原因和解決方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。