摘要:一前言在開發(fā)的過程中,難免會(huì)出現(xiàn)中文亂碼的問題。接下來(lái)寫的是我在解決中文亂碼問題時(shí)的學(xué)習(xí)心得,一是為了能加深印象,二是希望能幫初學(xué)者們解決一些疑惑。二正文之所以會(huì)出現(xiàn)中文亂碼,是因?yàn)樵谶M(jìn)行時(shí)的編碼方式不正確。
一、前言
在開發(fā)JavaWeb的過程中,難免會(huì)出現(xiàn)中文亂碼的問題。接下來(lái)寫的是我在解決中文亂碼問題時(shí)的學(xué)習(xí)心得,一是為了能加深印象,二是希望能幫初學(xué)者們解決一些疑惑。如有說的不對(duì)的地方,希望及時(shí)指出批評(píng)。
二、正文
之所以會(huì)出現(xiàn)中文亂碼,是因?yàn)樵谶M(jìn)行I/O時(shí)的編碼方式不正確。而I/O主要有磁盤I/O和網(wǎng)絡(luò)I/O。下邊我們就從編寫一個(gè)Java文件開始進(jìn)行分析。
1.編寫文件
比如當(dāng)創(chuàng)建一個(gè)文本文件,內(nèi)空寫上“My name is 王某某”,然后直接Ctrl+S保存。再雙擊打開這個(gè)文件時(shí)理所當(dāng)然的能看到正確內(nèi)容。但是當(dāng)使用Sublime來(lái)打開這個(gè)文件時(shí)(使用UTF-8編碼打開),卻出現(xiàn)這種情況:
原因是在使用Ctrl+S直接保存文件的時(shí)候,采用的是ANSI編碼(打開剛剛的文本文件,另存為,可以看到使用的是哪種編碼方式
什么是ANSI編碼方式呢?在簡(jiǎn)體中文Windows操作系統(tǒng)中,ANSI代表的是GBK編碼。也就是說剛剛編寫的文件,在保存的時(shí)候使用了GBK編碼,打開時(shí)用的是UTF-8編碼,當(dāng)然會(huì)出現(xiàn)亂碼了。
所以為了解決從網(wǎng)上下載的代碼打開時(shí)有亂碼這種情況,只要設(shè)置打開文件的編碼方式和該文件本身的編碼方式一致就可以了。當(dāng)設(shè)置文件的編碼方式為ISO-8859-1時(shí),不要在文件中寫入中文字符
2.將Java文件編譯成class文件
無(wú)論在編寫java文件時(shí)使用的是何種編碼方式,在編譯成class文件后,都是一樣的Unicode編碼(準(zhǔn)確說是UTF-16編碼)。
3.JVM加載class文件
JVM加載class文件使用的是Unicode編碼方式。就是說之前在編寫Java文件時(shí),如果在文件中出現(xiàn)了
String s="中文字符";
定義的字符串在內(nèi)存中都是以Unicode編碼的形式存在。
這里只是說從class文件中加載進(jìn)來(lái)的字符串,不是說所有的的內(nèi)存中的字符串
內(nèi)存中的字符串不僅有從class文件中加載進(jìn)來(lái)的,還有從磁盤文件中讀取的、從數(shù)據(jù)庫(kù)中讀取的、從請(qǐng)求中讀取的等等。要保證不出現(xiàn)亂碼問題,當(dāng)然是要確定字符串來(lái)源的編碼方式,然后再以對(duì)應(yīng)的編碼方式來(lái)轉(zhuǎn)換。
4.在控制臺(tái)打印亂碼
創(chuàng)建2個(gè)Java文件,一個(gè)是ANSI編碼,一個(gè)是Utf-8編碼,2個(gè)Java文件的main方法里都寫入以下代碼:
String s="i我"; System.out.println(s);
然后使用cmd進(jìn)行編譯(在編譯utf-8編碼的文件時(shí)要在命令后加-encoding utf-8),然后運(yùn)行,都正常。
然后!我就在eclipse里進(jìn)行開發(fā)了!我將項(xiàng)目的文件編碼設(shè)置成utf-8:
但是!結(jié)果卻打印了亂碼!
而且連Servlet中響應(yīng)的內(nèi)容也亂碼了!弄到這里的時(shí)候我找了挺多文章都沒有能解決的。然后請(qǐng)教了一位前輩,讓我這樣來(lái)設(shè)置Eclipse的編碼方式:Window--Preferences--Workspace
然后就解決了eclipse中打印和輸入亂碼問題了。之前Eclipse出現(xiàn)亂碼的原因我也沒想明白,難道是編譯時(shí)沒有使用UTF-8編碼嗎?希望知道的前輩能夠指點(diǎn)一下,感激不盡。
5.輸出
Servlet中設(shè)置請(qǐng)求和響應(yīng)對(duì)象的編碼方式就可以了,這個(gè)沒啥好說的了。
req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8");
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65794.html
摘要:經(jīng)常有讀者在公眾號(hào)上問亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因都不一樣,給每位小伙伴都把亂碼的原因講一遍也挺費(fèi)時(shí)間的,因此,松哥今天決定寫一篇文章,和大伙好好捋捋中的亂碼問題 經(jīng)常有讀者在公眾號(hào)上問 JavaWeb 亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因...
摘要:方法的參數(shù)不但可以使相對(duì)于上下文根的路徑,而且可以是相對(duì)于當(dāng)前的路徑。如和都是合法的路徑。 轉(zhuǎn)發(fā)與重定向區(qū)別是什么 在調(diào)用方法上 轉(zhuǎn)發(fā) 調(diào)用 HttpServletRequest 對(duì)象的方法 request.getRequestDispatcher(test.jsp).forward(req, resp); 重定向 調(diào)用 HttpServletResponse 對(duì)象的方法 res...
摘要:文件拷貝的模板代碼會(huì)自動(dòng)關(guān)閉但是,如果下載中文文件,頁(yè)面在下載時(shí)會(huì)出現(xiàn)中文亂碼或不能顯示文件名的情況,原因是不同的瀏覽器默認(rèn)對(duì)下載文件的編碼方式不同,是編碼方式,而火狐瀏覽器是編碼方式。 1.HttpServletResponse概述 我們?cè)趧?chuàng)建Servlet時(shí)會(huì)覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個(gè)參數(shù),一個(gè)為代表請(qǐng)求的request和代表...
摘要:概述在創(chuàng)建時(shí)會(huì)覆蓋方法,或這些方法都有兩個(gè)參數(shù),一個(gè)為代表請(qǐng)求的和代表響應(yīng)。方法中的的類型是,而方法的的類型是,是的子接口,功能和方法更加強(qiáng)大。 1.HttpServletRequest概述 在創(chuàng)建Servlet時(shí)會(huì)覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個(gè)參數(shù),一個(gè)為代表請(qǐng)求的request和代表響應(yīng)response。 service方法中的re...
摘要:概述是公司提供的一門用于開發(fā)動(dòng)態(tài)資源的技術(shù)。把開發(fā)好的類部署到服務(wù)器中。應(yīng)用程序被停止或重新啟動(dòng)之前,引擎將卸載,并在卸載之前調(diào)用的方法。 servlet概述 Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。 Sun公司在其API中提供了一個(gè)servlet接口,用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個(gè)步驟: (1)...
閱讀 3324·2021-11-19 09:40
閱讀 3059·2021-09-09 09:32
閱讀 871·2021-09-02 09:55
閱讀 1452·2019-08-26 13:23
閱讀 2528·2019-08-26 11:46
閱讀 1293·2019-08-26 10:19
閱讀 2133·2019-08-23 16:53
閱讀 1128·2019-08-23 12:44