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