Java字元轉換問題

來源:互聯網
上載者:User
Java字元轉換問題
 什麼是位元組流與字元流的轉換? 什麼時候會做轉換?
字元就是char類型, 是雙位元組的, 用unicode, 一個char就是實際上的一個字元;位元組就是byte類型, 是單位元組的,實際的字串根據編碼不同,用單位元組或者雙位元組來表示。
常用的String類型核心就是char[],String.length()就是char[]數組的大小,因此當encoding沒有轉換錯誤時,String長度是字元的個數,不管是中文還是英文。做字元處理的時候也從來不會出現截斷半個字元的問題。
Java內部都是用char的,但是很多時候做輸入輸出就要用byte stream,例如檔案、資料庫、網路。
當資料要從char變為byte,或者byte變成char時,就要做轉換。
同樣的內容,用不同的編碼方式(encoding),byte stream是不同的,轉換的時候需要指定使用的encoding。
JVM的file.encoding屬性確定了JVM的預設的編碼/解碼方式:從而影響應用中所有位元組流==>字元流的解碼方式 字元流==>位元組流的編碼方式。在不同OS平台上,這是由locale決定的,預設encoding在中文平台為GBK,英文平台為8859_1。

* UTF8與unicode
準確的說,UTF8不是unicode,它也只是一種編碼方式,不過它的編碼空間可以容納unicode的所有字元。因此UTF8是一種很適合於儲存unicode的外碼。UTF8是變長編碼,中文3位元組。

* Java I/O
Reader和Writer核心是char,InputStream和OutputStream核心是byte。
專門有bridge類做Reader/Writer與InputStream/OutputStream的轉換:InputStreamReader/OutputStreamWriter。

* 什麼地方會發生轉換?

  • 從資料庫到java程式 byte——〉char
  • 從java程式到資料庫 char——〉byte
  • 從檔案到java程式 byte——〉char
  • 從java程式到檔案 char——〉byte
  • 從java程式到頁面顯示 char——〉byte
  • 從頁面form提交資料到java程式 byte——〉char
  • 從流到java程式 byte——〉char
  • 從java程式到流 char——〉byte

    * 來源程式中的字串
    最早的位元組流解碼過程從javac的代碼編譯就開始了,寫在源檔案中的字串是按照一定的編碼方式的(如gbk),java編譯器根據預設的encoding來對原始碼中的字串做解碼,在java bytecode中儲存為unicode char。

    * 資料庫中的字元編碼方式
    資料庫中的東西都是二進位存放的,支援任何資料,理論上說,與編碼並沒有關係。不過,如果沒有指定字元集,在排序、匹配的時候有問題,介面的地方也會出現問題。
    因此就涉及到以什麼編碼方式來儲存到資料庫中了。平常我們用資料庫工具或者其他程式寫資料庫時,都是直接用系統編碼方式,也就是gbk。但是,JDBC在訪問資料庫時,預設是用資料庫的字元集,通常為8859_1的,本來應該是gbk->unicode卻變成了8859_1->unicode,就會出現亂碼。串連串中加上參數可以強制jdbc按照gbk做轉換。
    jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK
    不過這樣資料庫還是只能支援gbk,如果寫入big5碼,同樣會出現轉換錯誤的問題。最佳方案還是用UTF8來編碼,這樣可以容納unicode所有字元,覆蓋了gbk、big5等各個字元集的範圍。
    MySQL原來不支援UTF8,直到目前的最新版本4.1才加入unicode支援,但目前4.1版本還在alpha階段。

    * Swing的字元集問題
    從目前的實驗看來,swing的組件會自動根據系統encoding做轉換,並不需要幹預。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.