關(guān)于亂碼問題的解決與HttpServletResponse中的方法

聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫浙于,學員有權(quán)匿名愿卒,對文章有最終解釋權(quán)蜈敢;凱哥學堂旨在促進VIP學員互相學習的基礎(chǔ)上公開筆記。

關(guān)于亂碼問題的解決

會有亂碼現(xiàn)象殴俱,其實就是因為字符集編碼不一致的問題政冻,就好像中國人和外國人談話一樣,互相不懂對方在說啥线欲。字符集編碼也是如此明场,本來就是一段GBK編碼的文字,卻要用utf-8的編碼格式去解碼李丰,就當然是雞同鴨講會出現(xiàn)亂碼啦苦锨,這個時候就得使用GBK編碼的格式去解碼才不會出問題。如果互相都是使用的GBK編碼后,那就像中國人和中國人都說普通話一樣逆屡,就能聽懂對方在說什么,這樣才不會出現(xiàn)亂碼踱讨。

在web開發(fā)中魏蔗,請求或響應數(shù)據(jù)時出現(xiàn)亂碼,往往就是客戶端和服務端的編碼不一致的問題所導致的痹筛。

不過在介紹如何解決亂碼的問題前莺治,我們先看看HttpServletRequest中關(guān)于獲得表單數(shù)據(jù)的一些方法,雖然在上一篇也介紹了使用方式帚稠,不過關(guān)于亂碼和拿到具體的值這方面沒有涉及到:

獲得和設置表單數(shù)據(jù)方法(如果是上傳文件的話則無法獲取文件中的數(shù)據(jù)):

既然和表單有關(guān)谣旁,那么就得先寫一個簡單的html表單代碼,我們可以在Eclipse中創(chuàng)建一個html文件:

可能使用Eclipse編寫HTML的代碼不太方便滋早,我們也可以使用一個專門編寫html代碼的工具來編寫Eclipse里已經(jīng)創(chuàng)建了的html文件榄审,我這里使用HBuilder作為示例:

1.復制Eclipse中的html文件所在目錄的路徑:

2.在HBuilder中點擊文件,然后選擇打開目錄把復制的文件路徑粘貼進去杆麸,并為這個工程起一個新的名稱:

工程目錄如下:

如圖搁进,可以看到index.html已經(jīng)在這個工程下了,我們可以在HBuilder中編輯這個html文件昔头,編輯的內(nèi)容會同步到Eclipse饼问,因為它倆訪問的都是同一個目錄同一個html文件。

3.我在HBuilder編輯的代碼如下:

4.再看看Eclipse發(fā)生了什么:

可以看到代碼是同步的揭斧。

瀏覽器運行結(jié)果:

以下使用實際代碼演示常用的幾個獲得表單數(shù)據(jù)的方法莱革,代碼示例:

在Eclipse中執(zhí)行html文件,Eclipse有一個內(nèi)置的瀏覽器:

如果要在其他的瀏覽器則需要使用這個URL地址:

http://localhost:8080/TestResponse/index.html

不要直接在HBuilder中運行這個html文件讹开,因為它的URL是指向HBuilder的工程路徑的盅视。

控制臺打印結(jié)果:

如圖,可以看到我們將所有的值都獲得到手了萧吠。

獲得表單數(shù)據(jù)的時候要注意一個問題:當你需要獲得一個屬性的值時左冬,如果得到的結(jié)果為null,那么就是因為表單數(shù)據(jù)中并沒有這個屬性的存在纸型。例如我獲得一個不存在的屬性:

控制臺打印結(jié)果:

可以看到結(jié)果為null拇砰,所以當你獲得表單數(shù)據(jù)進行某些操作時,出現(xiàn)了空指針異常的話狰腌,很有可能就是因為代碼上寫錯了獲得了一個不存在的屬性除破。

如果表單數(shù)據(jù)中的某個屬性值沒有寫,那么獲得的將是一個空字符串琼腔,而非null瑰枫,例如:

控制臺打印結(jié)果:

如圖,并沒有打印null,而是打印空白光坝,這個空白就是一個空字符串:’’

會出現(xiàn)亂碼的情況尸诽,以及解決方法:

現(xiàn)在我們修改一下代碼把表單提交的方法改為post,再運行一次盯另,看看控制臺的打印結(jié)果性含,html代碼示例:

Java代碼示例:

提交的表單:

控制臺的打印結(jié)果:

可以看到控制臺中的打印結(jié)果出現(xiàn)了不能識別的字符,解決方法很簡單鸳惯,使用setCharacterEncoding(String)方法商蕴,設置表單提交的數(shù)據(jù)的編碼格式即可:

運行結(jié)果:

注意:除了在Java代碼中需要設置編碼格式椎镣,在html文件中也要設置好編碼格式壤躲,如果html中不設置編碼格式的話,即便在Java代碼中使用了setCharacterEncoding(String)方法設置了也沒有用耳璧,所以這是雙向的辅鲸,例如我把html文件中設置編碼格式的標簽給刪掉:

可以看到在網(wǎng)頁上顯示都是亂碼(這是因為Eclipse內(nèi)置的瀏覽器原因格郁,一般市面上的瀏覽器提前預設了字符編碼,所以不會出現(xiàn)這種情況)

控制臺打印結(jié)果:

果然出現(xiàn)了不能識別的字符瓢湃,所以html文件也是需要設置好編碼的理张,不然的話就會出現(xiàn)亂碼的情況。

下面來看看瀏覽器的地址欄中為什么能夠顯示中文:

這其實是因為瀏覽器轉(zhuǎn)碼了绵患,可以把這個URL復制到記事本中:

可以看到是一堆的編碼雾叭,并沒有顯示中文,所以實際上瀏覽器就是把這個編碼給轉(zhuǎn)換成了中文而已落蝙。

只要不屬于128個字符內(nèi)的字符织狐,在地址欄中都會轉(zhuǎn)換成這種格式的編碼,這些編碼格式是采用的16進制的編碼格式筏勒,以上面這文本示例編碼對應的中文:

如圖移迫,每一個16進制編碼都是以%開頭,這是utf-8編碼的中文管行,所以一個中文字對應3個16進制編碼厨埋。

如果是GBK編碼格式的中文則是一個中文字對應2個16進制編碼,但是GBK編碼格式轉(zhuǎn)換成的16進制編碼不能被瀏覽器轉(zhuǎn)換捐顷,會仍然顯示著16進制編碼:

中文字對應的16進制編碼:

如圖荡陷,GBK編碼格式的中文字和utf-8編碼的中文字不一樣,是2個16進制編碼對應一個中文字迅涮。

關(guān)于客戶端請求數(shù)據(jù)方面的亂碼情況就介紹這么多废赞,另外響應數(shù)據(jù)中出現(xiàn)亂碼的情況和解決方法在介紹HttpServletResponse方法部分進行說明。

思維導圖:

HttpServletResponse中的方法

HttpServletResponse接口類型的對象是封裝服務端響應數(shù)據(jù)的叮姑,所以這個對象中的方法都是與響應數(shù)據(jù)相關(guān)唉地。以下羅列一些常用的方法:

下面使用實際的例子,演示以上方法的使用方式:

編輯響應頭一類的方法:

代碼示例:

在服務端設置響應數(shù)據(jù)的編碼格式是很有必要的,這么做同樣的也是為了避免出現(xiàn)亂碼的問題耘沼。例如以下這個示例极颓,我不設置響應數(shù)據(jù)的編碼格式,并輸出一段中文群嗤,看看會發(fā)生什么讼昆,代碼示例:

運行結(jié)果:

如圖,可以看到骚烧,沒有設置響應數(shù)據(jù)的編碼格式的話,輸出中文就會無法被識別闰围。

這種問題設置一下響應數(shù)據(jù)的編碼格式就好了赃绊,但是服務端設置的編碼格式,要與瀏覽器端的編碼格式對應上羡榴,如果不對應的話仍然會是亂碼碧查,代碼示例:

運行結(jié)果:

添加新的響應頭數(shù)據(jù):

代碼示例:

打開TCP/IP Monitor窗口,可以看到以上代碼添加進響應頭的數(shù)據(jù):

獲得設置的響應頭信息:

代碼示例:

控制臺打印結(jié)果:

修改響應頭信息:

代碼示例:

TCP/IP Monitor窗口:

總結(jié):

解決客戶端表單提交數(shù)據(jù)亂碼的問題校仑,需要使用setCharacterEncoding(String)方法忠售,設置好與客戶端對應的編碼格式。

解決服務端響應數(shù)據(jù)亂碼的問題迄沫,則使用setCharacterEncoding(String)方法稻扬,設置好對應的編碼格式。

HttpServletRequest是封裝請求數(shù)據(jù)的對象羊瘩,所以它的方法都是與客戶端請求信息相關(guān)的泰佳。

HttpServletResponse是封裝響應數(shù)據(jù)的對象,所以它的方法都是與服務端響應信息相關(guān)的尘吗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逝她,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子睬捶,更是在濱河造成了極大的恐慌黔宛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擒贸,死亡現(xiàn)場離奇詭異臀晃,居然都是意外死亡,警方通過查閱死者的電腦和手機酗宋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門积仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕猫,你說我怎么就攤上這事寂曹。” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵隆圆,是天一觀的道長漱挚。 經(jīng)常有香客問我,道長渺氧,這世上最難降的妖魔是什么旨涝? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侣背,結(jié)果婚禮上白华,老公的妹妹穿的比我還像新娘。我一直安慰自己贩耐,他們只是感情好弧腥,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著潮太,像睡著了一般管搪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铡买,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天更鲁,我揣著相機與錄音,去河邊找鬼奇钞。 笑死澡为,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的景埃。 我是一名探鬼主播缀壤,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纠亚!你這毒婦竟也來了塘慕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒂胞,失蹤者是張志新(化名)和其女友劉穎图呢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骗随,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蛤织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸿染。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片指蚜。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涨椒,靈堂內(nèi)的尸體忽然破棺而出摊鸡,到底是詐尸還是另有隱情绽媒,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布免猾,位于F島的核電站是辕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猎提。R本人自食惡果不足惜获三,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锨苏。 院中可真熱鬧疙教,春花似錦、人聲如沸伞租。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肯夏。三九已至,卻和暖如春犀暑,著一層夾襖步出監(jiān)牢的瞬間驯击,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工耐亏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徊都,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓广辰,卻偏偏與公主長得像暇矫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子择吊,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理李根,服務發(fā)現(xiàn),斷路器几睛,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 編碼問題一直困擾著開發(fā)人員房轿,尤其在 Java 中更加明顯,因為 Java 是跨平臺語言所森,不同平臺之間編碼之間的切換...
    x360閱讀 2,480評論 1 20
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,111評論 25 707
  • 這些天忙成鬼囱持,看了些關(guān)于區(qū)塊鏈的書,記了寫東西焕济。 就當是給區(qū)塊鏈的情書吧纷妆。 十年后的區(qū)塊鏈就是今天的互聯(lián)網(wǎng)。 20...
    金金視界閱讀 173評論 0 1
  • 文/瓦哨 老屋終究是帶著我童年的記憶一起老了晴弃,快的讓我措手不及掩幢,那是我深深眷戀的老屋把放摹! 童年的時光總是那樣美好粒蜈,...
    瓦哨閱讀 251評論 4 3