取經(jīng)

          學習Java的過程猶如唐玄奘西天取經(jīng)的過程,不經(jīng)歷各種困難是無法取得成功的。
          posts - 8, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [轉(zhuǎn)]Java字符集轉(zhuǎn)換解釋

          Posted on 2005-11-23 11:24 Frank Hou 閱讀(2339) 評論(0)  編輯  收藏 所屬分類: 其他相關技術

          轉(zhuǎn)自:Trucy Weblog
          http://www.trucy.org/blog/archives/eoiae/000207.html
          http://www.trucy.org/blog/lazet/archives/000649.html


          Java系統(tǒng)內(nèi)的字符以雙字節(jié)存儲,采用unicode(utf-16之一)編碼。(估計jdk后續(xù)版本的java字符編碼可能提升為4字節(jié),這樣可徹底解決東方國家字庫問題。)
          Utf-8是一種標準存儲編碼格式,用utf-8編碼后的字節(jié)流具有非常好的防(糾)錯和兼容能力。用utf-8編碼(encode)unicode碼時不會有信息損失。當然用utf-8解碼(decode)utf-8編碼的字節(jié)流,生成unicode碼時也不會有信息損失。但禁止用utf-8解碼非utf-8編碼的字節(jié)流。總之Utf-8可以編碼任何unicode 碼,但只能解碼utf-8編碼的字節(jié)流。
          Utf-16和utf-8用法是一樣的,僅是一點不同:utf-16是雙字節(jié)倍數(shù)編碼,utf-8是單字節(jié)倍數(shù)編碼,在英文國家里用utf-8和ascii編碼后的字節(jié)流是一樣的,這樣有利于系統(tǒng)平穩(wěn)升級到支持utf-8的系統(tǒng)里,但系統(tǒng)要升級到支持utf-16就要把所有數(shù)據(jù)都更新一遍,這顯然不能接受。注意:utf-16根據(jù)字節(jié)排序不同有兩種編碼

          Iso8859-1是西方國家頻繁使用的字符編碼格式。用iso8859-1編碼unicode碼中的東方字庫部分的字符時統(tǒng)統(tǒng)編碼成??,也就是說:用iso8859-1編碼unicode碼時信息會有損失。但用iso8859-1解碼任意(iso8859-1編碼的和非iso8859-1編碼的)字符流時,信息不會有損失,這是因為一個字節(jié)中的所有256個字符對iso8859-1都是合法的都是合法的。有時候在一些linux操作系統(tǒng)和一些應用服務器里,默認的解碼方式是iso8859-1,這是大多數(shù)亂碼的原因。
          Gb18030,gbk,gb2312是漢字字符的編碼格式,用gb18030(gbk,gb2312和gb18030是同一系列,不過字庫要小,但使用方式是一樣的,這里不區(qū)分,統(tǒng)統(tǒng)用gb18030)編碼unicode碼時非中英文的字符會被編碼為?,也就是說,用gb18030只能編碼unicode中的中英文字符,其他的字符都會被損失掉。同樣用gb18030解碼只能解碼gb18030編碼的字符流。
          Xml文件中 是告訴瀏覽器要用要用指定的編碼格式解碼自身這個文件,當然要求瀏覽器首先要支持這個編碼格式(在客戶端),jsp頁面的字符集<%@ page contentType="text/html; charset=GBK" %>是告訴jsp服務器要用要用指定的編碼格式解碼自身這個jsp文件(在服務器段). 然而在servlet程序中response.setContentType("text/html; charset=GBK");是告訴servlet程序用指定編碼格式編碼(在服務器段)
          字符集轉(zhuǎn)換的基本思想很簡單,用某種字符編碼規(guī)則編碼,就用什么編碼規(guī)則解碼,經(jīng)常出問題的深層次原因是java對字節(jié)流未提供編碼信息,可以認為這是一個嚴重的失誤。估計未來的java能提供這樣的信息。…待續(xù)
          涉及編碼問題的地方有:java類文件編輯時,java類文件編譯時,實施文件,服務器指定,jsp文件內(nèi)指定,xml(html)內(nèi)指定,servlet文件指定,資源連接點配置中指定.
          不能正常顯示原因通常在兩個地方:字符集;字庫。對于通用的軟件,一般都提供完整的字庫支持。所以一般問題是解碼不正確。


          續(xù)Java字符集轉(zhuǎn)換解釋
          每個軟件系統(tǒng)內(nèi)部都只使用1種字符碼來表示內(nèi)存中數(shù)據(jù),如java使用unicode來表示。
          但由于unicode碼的數(shù)據(jù)沒有糾錯能力,所以在用文件或數(shù)據(jù)庫來存放數(shù)據(jù)時很少直接采用。
          utf-8及utf-16是從為unicode碼提供糾錯能力這個目的發(fā)展起來的。由于utf-8和過去的ascii兼容,所以utf-8成為主流用于存儲unicode碼的轉(zhuǎn)換編碼方式。utf-8及utf-16不是一種編碼,僅僅是一種編碼轉(zhuǎn)換規(guī)則而已。
          gbk(gb2312,gb18030)是遵循unicode而制定的用于漢字編碼的unicode碼。
          iso8859-1是西歐文字編碼。用完了一個字節(jié)的所有256個代碼。
          在java系統(tǒng)里,內(nèi)存中的數(shù)據(jù)必須用unicode編碼,所以讀取各種存儲設備的數(shù)據(jù)時,都需要先根據(jù)存儲設備中的數(shù)據(jù)的編碼規(guī)則進行解碼讀取;存儲數(shù)據(jù)時,需要根據(jù)存儲設備要求的編碼規(guī)則進行編碼存儲。所以在java內(nèi)存中以unicode為中介,可以在各種編碼規(guī)則之間來回自由轉(zhuǎn)換。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 图木舒克市| 鄂尔多斯市| 莎车县| 夏河县| 利川市| 嵊州市| 德阳市| 神木县| 德令哈市| 田林县| 错那县| 亚东县| 梓潼县| 乌苏市| 台北县| 夏河县| 大埔县| 绥棱县| 交口县| 乌苏市| 宜良县| 洞头县| 隆林| 汝阳县| 乌拉特后旗| 南和县| 芒康县| 蛟河市| 息烽县| 巴林右旗| 灵台县| 会昌县| 明星| 垦利县| 循化| 竹山县| 舟曲县| 嘉义县| 七台河市| 乐平市| 启东市|