<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    持之以恒

    記錄本
    posts - 4, comments - 32, trackbacks - 0, articles - 74
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Unicode、UTF-8 和 ISO8859-1到底有什么區別

    Posted on 2012-06-20 12:44 小白19870626 閱讀(3264) 評論(0)  編輯  收藏 所屬分類: other

    轉自:http://zhao860606.blog.163.com/blog/static/105838171200910233225699/

     

    Unicode、UTF-8 和 ISO8859-1到底有什么區別

    1.本文主要包括以下幾個方面:編碼基本知識,java,系統軟件,url,工具軟件等。

    在下面的描述中,將以"中文"兩個字為例,經查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad e69687"。注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。

    2. 編碼基本知識

    最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。

    2.1. iso8859-1 通常叫做Latin-1

    屬于單字節編碼,最多能表示的字符范圍是0-255,應用于英文系列。比如,字母a的編碼為0x61=97。

    很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由于是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字符,使用iso8859-1編碼的時候則將它拆開為4個字節來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以字節為單位處理的)。而如果是UTF編碼,則是6個字節"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。

    2.2. GB2312/GBK

    這就是漢子的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。

    2.3. unicode

    這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a為"00 61"。

    需要說明的是,定長編碼便于計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。

    2.4. UTF

    考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對于英文字母,unicode也需要兩個字節來表示。所以unicode不便于傳輸和存儲。因此而產生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。

    注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對于unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對于漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字符。

    3. java對字符的處理

    在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。

    3.1. getBytes(charset)

    這是java字符串處理的一個標準函數,其作用是將字符串所表示的字符按照charset編碼,并以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節"d6 d0 ce c4"。如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個問號)。

    3.2. new String(charset)

    這是java字符串處理的另一個標準函數,和上一個函數的作用相反,將字節數組按照charset編碼進行組合識別,最后轉換為unicode存儲。參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個問號)。

    因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。

    3.3. setCharacterEncoding()

    該函數用來設置http請求或者相應的編碼。

    對于request,是指提交內容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而后續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對于GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。

    4.iso-8859-1是JAVA網絡傳輸使用的標準 字符集,而gb2312是標準中文字符集,當你作出提交表單等需要網絡傳輸的操作的時候,就需要把 iso-8859-1轉換為gb2312字符集顯示,否則如果按瀏覽器的gb2312格式來解釋iso-8859-1字符集的話,由于2者不兼容,所以會 是亂碼.

    分類: 7788


    小白
    主站蜘蛛池模板: 中文字幕亚洲免费无线观看日本 | 精品人妻系列无码人妻免费视频 | 亚洲av无码不卡私人影院| 亚洲综合色7777情网站777| 亚色九九九全国免费视频| 亚洲中文无码av永久| 成人特黄a级毛片免费视频| 亚洲中文字幕久久精品蜜桃| 免费观看的a级毛片的网站| 国产成人精品亚洲一区| 亚洲综合区小说区激情区| 免费人成激情视频在线观看冫| 亚洲高清国产拍精品26U| 最近中文字幕完整免费视频ww| 亚洲国色天香视频| 久久久www成人免费毛片| 亚洲AV日韩AV无码污污网站| 亚洲精品成人久久久| 99在线免费视频| 亚洲国产精品成人精品软件| 好吊妞在线成人免费| 在线永久免费的视频草莓| 亚洲性69影院在线观看| 在线观看亚洲免费| 国产亚洲精品第一综合| 自拍偷自拍亚洲精品情侣| 97av免费视频| 亚洲风情亚Aⅴ在线发布| 亚洲人妻av伦理| 91大神免费观看| 亚洲精品理论电影在线观看| 亚洲一区二区三区在线播放| 久久一区二区三区免费播放| 亚洲一区欧洲一区| 精品国产亚洲一区二区在线观看 | 亚洲hairy多毛pics大全| 国产日产亚洲系列| 可以免费看黄视频的网站| 黄色a三级免费看| 亚洲国产精品线观看不卡| 亚洲黄片毛片在线观看|