Java編碼和servlet亂碼問題(1)-Java編碼

    在寫這邊文章時,在網上扒拉了好久,發現好多博客總結的都很是好,我也是參考了不少,在文章最後會列出一些以爲不錯的博客地址,你們若是有興趣能夠去看看。 html

    本篇主要是簡單介紹Java編碼知識,若是已經很是瞭解,能夠手抖了,把寶貴時間用到看其餘文章上面吧。 java

    你們都知道中文須要編碼後傳輸纔不會有亂碼,可是爲何要編碼呢,由於計算機的一個最基本的存儲單元byte沒法表示一箇中文字符,因此咱們必須先把中文字符通過轉換,轉換成計算機可以表示的字符。當須要從新讀取這些字符時,按照以前的轉換規則,再轉換回來就能夠了。 web

    這裏的轉換規則就是咱們的所說的編碼方式了,常見的有ASCII、ISO-8859-一、GB23十二、GBK、UTF-八、UTF-16等。首先咱們的字符在jvm都是Unicode編碼,而上面的那些編碼方式就是在傳輸時或顯示時用什麼樣的編碼方式。好比你把字符串以UTF-8編碼方式轉換成Unicode編碼存儲,而後等再次讀取的時候仍是採用UTF-8編碼方式來反編碼,就能獲取到正確的字符。由於Unicode編碼採用了世界統一的碼錶進行編碼,所以相同的字符對應不一樣的系統或環境對應的Unicode碼是同樣的。 數據庫

    好比一個字符串「中國」,他的Unicode碼是必定的,若是經過getBytes("GBK")方法,其中的內部邏輯就是首先「中國」的Unicode碼轉換成GBK編碼,而後用GBK編碼後的數據進行傳遞。當對方拿到這個字節數組之後,經過new String(recBytes,"GBK"),就能把獲取到的GBK編碼的字節數組用GBK編碼重組後再轉換成Unicode編碼來存儲或顯示。可是對於GBK.GB2312,UTF-8等這些雙字節編碼而言,對中文進行編碼、轉碼徹底沒有問題,只有先後的編碼格式同樣就能夠,而ISO-8859-1這些單字節編碼就不行了,由於是單字節,因此能表示的字符範圍是0-255,只能對英文字符、數字等表示。好比對於「中國」,用上面的getBytes("ISO-8859-1"),這時你將獲得3f,3f(3f表示?),由於ISO-8859-1沒有「中國」的對應字符集,因此只好以?來表示了數組

    最後要說的是,實際上咱們可能會跟各個渠道或設備打交道,好比瀏覽器、數據庫、文件等,在進行轉碼或存儲的時候,最好都指定一個固定的字符集,而後統一進行轉換,就不會遇到亂碼的問題。對於web項目可能遇到亂碼的概率比較大,這個問題會在下一篇文章中集中分析一下。下面附上一些以爲不錯的文章,不想看本文的能夠直接猛擊下面連接。 瀏覽器

http://blog.csdn.net/qinysong/article/details/1179513 jvm

http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 編碼

http://blog.sina.com.cn/s/blog_000598fc0100tvlz.html spa

http://www.blogjava.net/zhenandaci/category/31869.html .net

相關文章
相關標籤/搜索