欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb中文編碼問題實例講解

 更新時間:2019年09月12日 15:18:05   投稿:laozhang  
在本篇文章里小編給大家整理的是關(guān)于JavaWeb中文編碼問題方法的相關(guān)知識點內(nèi)容,需要的朋友們參考下

一、JavaWeb編程中亂碼的成因

因為計算機只認識0與1,在網(wǎng)絡(luò)上要想傳輸各種字符就需要進行編碼。而由于編碼、傳輸、解碼過程存在各種不確定性,導(dǎo)致亂碼問題頻發(fā),成為困擾初學(xué)者的一大問題。本文就試圖用最簡單的示例解釋亂碼問題。

1.為什么會出現(xiàn)亂碼問題

如同發(fā)電報一樣,如果發(fā)報的采用一個密碼本進行發(fā)報,而接收端采用另外的密碼本進行解碼,肯定會導(dǎo)致無法解碼一樣。如果在計算機網(wǎng)絡(luò)中傳輸數(shù)據(jù),發(fā)送端采用的編碼和接收端采用的編碼不一致就會導(dǎo)致亂碼問題。

2.認識各種編碼:

ASCII:

ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標準ISO/IEC 646。

ISO-8859-1:

由于ASCII是美國標準,其收錄了空格及94個“可印刷字符”,足以給英語使用。但是,其他使用拉丁字母的語言(主要是歐洲國家的語言),都有一定數(shù)量的附加符號字母,故需要使用ASCII及控制字符以外的區(qū)域來儲存及表示。

為了解決這個問題,國際標準化組織(ISO)及國際電工委員會(IEC)聯(lián)合制定的一系列8位字符集的標準ISO-8859,其全稱ISO/IEC 8859,現(xiàn)時定義了15個字符集。除了使用拉丁字母的語言外,使用西里爾字母的東歐語言、希臘語、泰語、現(xiàn)代阿拉伯語、希伯來語等,都可以使用這個形式來儲存及表示。

GBK/GB2312:

為了解決中文的顯示和編輯問題,1980年中國國家標準總局發(fā)布了GB2312標準,全稱是《信息交換用漢字編碼字符集》,標準號是GB 2312—1980。GB2312編碼適用于漢字處理、漢字通信等系統(tǒng)之間的信息交換,通行于中國大陸;新加坡等地也采用此編碼。中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持GB 2312?;炯彩杖霛h字6763個和非漢字圖形字符682個。GB 2312的出現(xiàn),基本滿足了漢字的計算機處理需要,它所收錄的漢字已經(jīng)覆蓋中國大陸99.75%的使用頻率。但是對于人名、古漢語等方面出現(xiàn)的罕用字,GB 2312不能處理,這導(dǎo)致了后來GBK及GB 18030漢字字符集的出現(xiàn)。

1995年中國國家標準總局又頒布了《漢字編碼擴展規(guī)范》(GBK)。GBK與GB 2312—1980國家標準所對應(yīng)的內(nèi)碼標準兼容,同時在字匯一級支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢字,共計20902字。

國家標準GB18030-2005《信息技術(shù) 中文編碼字符集》是我國繼GB2312-1980和GB13000.1-1993之后最重要的漢字編碼標準,是我國計算機系統(tǒng)必須遵循的基礎(chǔ)性標準之一。 GB18030有兩個版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特點是在GBK基礎(chǔ)上增加了CJK統(tǒng)一漢字擴充A的漢字。GB18030-2005的主要特點是在GB18030-2000基礎(chǔ)上增加了CJK統(tǒng)一漢字擴充B的漢字。GB18030-2005是我國自主研制的以漢字為主并包含多種我國少數(shù)民族文字(如藏、蒙古、傣、彝、朝鮮、維吾爾文等)的超大型中文編碼字符集強制性標準,其中收入漢字70000余個。中文的Windows操作系統(tǒng)默認使用GBK/GB2312編碼。

Unicode:

很多傳統(tǒng)的編碼方式都有一個共同的問題,即容許電腦處理雙語環(huán)境(通常使用拉丁字母以及其本地語言),但卻無法同時支持多語言環(huán)境(指可同時處理多種語言混合的情況)。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,例如ISO 8859所定義的字符雖然在不同的國家中廣泛地使用,可是在不同國家間卻經(jīng)常出現(xiàn)不兼容的情況。Unicode的出現(xiàn),能夠使計算機實現(xiàn)跨語言、跨平臺的文本轉(zhuǎn)換及處理。

UTF-8:

因為Unicode編碼使用2個字節(jié)存儲一個字符。事實證明,對可以用ASCII表示的字符使用Unicode并不高效,因為Unicode比ASCII占用大一倍的空間,而對ASCII來說高字節(jié)的0對他毫無用處。為了解決這個問題,就出現(xiàn)了一些中間格式的字符集,他們被稱為通用轉(zhuǎn)換格式,即UTF(Unicode Transformation Format)。

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼。由Ken Thompson于1992年創(chuàng)建。現(xiàn)在已經(jīng)標準化為RFC 3629。UTF-8用1到4個字節(jié)編碼UNICODE字符。用在網(wǎng)頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。

UTF-16:

UTF-16是Unicode字符編碼五層次模型的第三層:字符編碼表(Character Encoding Form,也稱為 "storage format")的一種實現(xiàn)方式。即把Unicode字符集的抽象碼位映射為16位長的整數(shù)(即碼元)的序列,用于數(shù)據(jù)存儲或傳遞。Unicode字符的碼位,需要1個或者2個16位長的碼元來表示,因此這是一個定長表示。Java語言默認使用UTF-16作為內(nèi)存的字符存儲格式。

二、各種亂碼的處理

亂碼的處理問題因為產(chǎn)生原因不同,需要使用不同的方式進行處理,現(xiàn)就不同的問題分情況討論如下:

1.響應(yīng)中的亂碼處理

A.使用字節(jié)輸出流輸出響應(yīng):

Stringdata="傳智播客";

response.getOutputStream().write(data.getBytes());

經(jīng)實測不會發(fā)生亂碼問題,原因是String的getBytes()方法默認使用本地平臺默認編碼將字符串轉(zhuǎn)換為字節(jié)數(shù)組,而我們中文的windows操作系統(tǒng)默認使用GBK編碼。而在用戶端,瀏覽器默認也使用操作系統(tǒng)默認編碼解析網(wǎng)頁,在windows系統(tǒng)下默認也是GBK。發(fā)送端及接收端編碼一致,所以不會產(chǎn)生亂碼問題。

由于UTF-8編碼是國際上通用的編碼,所以我們在做Web開發(fā)時,通常使用UTF-8編碼。但是如果使用getBytes("UTF-8")得到字節(jié)數(shù)組,并發(fā)送給客戶端,此時會產(chǎn)生亂碼問題。原因是因為getBytes("UTF-8")實際是指定按照UTF-8編碼將字符串轉(zhuǎn)換成字節(jié)數(shù)組。而瀏覽器此時默認仍然使用本地平臺默認編碼進行解碼就會發(fā)生亂碼問題。

此時的顯示效果如下:

此時可以使用以下方式解決亂碼問題:

方法一:手工調(diào)整瀏覽器的編碼

點擊鼠標右鍵,在彈出菜單中選擇編碼,之后選擇UTF-8編碼。

方法二:使用html規(guī)范中的meta標簽設(shè)置

添加上述代碼后,文字顯示正常。


方法三:使用Response對象的setHeader()方法設(shè)置Content-Type頭

另外,按照HTTP協(xié)議的規(guī)定,如果指定了消息正文的MIME類型后,瀏覽器就必須按照MIME類型解析,所以可以通過設(shè)置響應(yīng)消息頭Content-Type的值為text/html,并指定參數(shù)charset=UTF-8來使瀏覽器使用UTF-8解析頁面。


方法四:使用Response對象的setContentType()方法設(shè)置MIME類型及編碼

由于方法三的使用頻率比較高,所以在制定Servlet規(guī)范時,JCP組織抽取了一個比較簡單的方法,此方法與方法三的原理相同,只是更簡單,在實際工作中,我們通常使用此方法指定MIME類型。

B.使用字符輸出流輸出響應(yīng):

Response對象的getWriter()方法可以返回一個PrintWriter對象,輸出的內(nèi)容會暫存在緩沖區(qū)中。當響應(yīng)結(jié)束時,Tomcat使用默認編碼ISO-8859-1將Response對象的響應(yīng)消息正文轉(zhuǎn)換為二進制數(shù)據(jù)輸出給客戶端,而瀏覽器使用本地平臺默認編碼進行解碼,從而導(dǎo)致亂碼。



處理方式:使用response.setCharacterEncoding("UTF-8")方法告知Tomcat使用UTF-8而不是ISO-8859-1對響應(yīng)消息正文進行編碼。另外,還需要使用response.setContentType("text/html;charset=UTF-8")告知瀏覽器使用UTF-8編碼解碼傳遞過來的數(shù)據(jù)。


修改后的顯示效果如下:


2.請求中的亂碼處理

在用戶提交表單時,瀏覽器會按照當前頁面的編碼設(shè)置對中文字符進行編碼,并將內(nèi)容生成請求消息發(fā)送給服務(wù)器進行解析。Tomcat服務(wù)器得到請求消息后,會依據(jù)表單數(shù)據(jù)的位置不同,做不同的處理。

當提交方法(method)是POST時,表單數(shù)據(jù)會置于請求消息正文中,Tomcat默認使用ISO-8859-1對此部分內(nèi)容進行解碼,此時需要使用Request.setCharacterEncoding("UTF-8")告知服務(wù)器使用UTF-8編碼對請求消息正文進行解碼。



當提交方法(method)是GET時,表單數(shù)據(jù)會置于請求消息行中,并使用URL標準編碼方式進行二次編碼。而Tomcat得到此部分數(shù)據(jù)后,會先使用URL標準規(guī)范進行解碼,然后默認使用ISO-8859-1再進行二次解碼。此時如果使用Request.getParamater()方法得到String字符串得到的是經(jīng)過ISO-8859-1解碼的字符串,故會發(fā)生亂碼問題。對于此種情況,需要將得到的字符串重新按照ISO-8859-1打回字節(jié)數(shù)組,再重新解碼方可。




3.cookie中的亂碼處理;

因為cookie是分別使用Set-Cookie和Cookie消息頭在響應(yīng)和請求消息頭中進行傳輸?shù)?,而HTTP協(xié)議中,響應(yīng)消息和請求消息中只能使用英文字符,中文字符是不安全字符無法直接使用。故在將中文存入Cookie中時,需要進行編碼操作。我們可以使用URLEncoder工具類的encode()方法對中文進行編碼,在讀取時使用URLDecoder工具類的decode()方法進行解碼。

使用URLEncoder.encode()方法對username字符串進行編碼后再創(chuàng)建Cookie對象如下圖:


使用URLDecoder.decode()方法對username字符串進行解碼如下圖:


三、 總結(jié)

以上的例子只是拋磚引玉,只要我們能抓住問題的關(guān)鍵,了解亂碼的本質(zhì),那么亂碼什么的都是浮云。

以上就是關(guān)于JavaWeb中文編碼問題方法的全部知識點,感謝大家的學(xué)習(xí)和對腳本之家的支持。

相關(guān)文章

  • java中Timer定時器的使用和啟動方式

    java中Timer定時器的使用和啟動方式

    這篇文章主要介紹了java中Timer定時器的使用和啟動方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java實現(xiàn)對Hadoop的操作

    java實現(xiàn)對Hadoop的操作

    這篇文章主要介紹了java實現(xiàn)對Hadoop的操作,通過非常完整詳細的代碼展示了如何去進行一系列操作,包括基本操作,文件讀寫,需要的朋友可以參考下
    2021-07-07
  • 基于傳遞list類型的參數(shù)的問題

    基于傳遞list類型的參數(shù)的問題

    這篇文章主要介紹了基于傳遞list類型的參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例

    這篇文章主要介紹了SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring?cloud?實現(xiàn)房源查詢功能的實例代碼

    Spring?cloud?實現(xiàn)房源查詢功能的實例代碼

    這篇文章主要介紹了Spring?cloud?實現(xiàn)房源查詢功能,本項目是一個多模塊項目,創(chuàng)建一個 Spring Initializr 項目 不自動添加依賴項,完成創(chuàng)建后刪除自帶的src目錄,并在根目錄下創(chuàng)建新的maven模塊,需要的朋友可以參考下
    2022-09-09
  • java雙端隊列之ArrayDequeue原理講解

    java雙端隊列之ArrayDequeue原理講解

    這篇文章主要為大家介紹了java雙端隊列之ArrayDequeue原理講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 排序算法圖解之Java選擇排序

    排序算法圖解之Java選擇排序

    選擇排序的工作原理是:第一次從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€元素,存放在序列的起始位置,然后再從剩余的未排序元素中尋找到最?。ù螅┰兀缓蠓诺揭雅判虻男蛄械哪┪?。本文通過圖片和示例介紹了選擇排序,需要的可以參考一下
    2022-11-11
  • Spring-webflux?響應(yīng)式編程的實例詳解

    Spring-webflux?響應(yīng)式編程的實例詳解

    Spring 提供了兩個并行堆棧,一種是基于帶有 Spring MVC 和 Spring Data 結(jié)構(gòu)的 Servlet API,另一個是完全反應(yīng)式堆棧,它利用了 Spring WebFlux 和 Spring Data 的反應(yīng)式存儲庫,這篇文章主要介紹了Spring-webflux?響應(yīng)式編程,需要的朋友可以參考下
    2022-09-09
  • Maven打包跳過測試的三種方法

    Maven打包跳過測試的三種方法

    這篇文章主要介紹了Maven打包跳過測試的三種方法,幫助大家更好的理解和使用maven,感興趣的朋友可以了解下
    2020-11-11
  • java synchronized用法詳解

    java synchronized用法詳解

    本篇文章主要介紹了java synchronized用法詳解,synchronized是Java中的關(guān)鍵字,是一種同步鎖。有興趣的同學(xué)可以了解一下。
    2016-11-11

最新評論