編程語言:java 編碼方式:Unicode 問題: 通常狀況下,在屏幕顯示上一個漢字所佔的大小是字符的兩倍。若是直接使用length()方法,獲取到的是code unit的數目。 例如,「123abc長城」.length() 計算是8。如何肯定字符串在屏幕上的長度大小? 分析: 咱們須要一種方法使得漢字的長度是普通字符的兩倍。 爲了得到10,須要從頭掃描根據字符的Ascii來得到具體的長度。若是是標準的字符,Ascii的範圍是0至255,若是是漢 字或其餘全角字符,Ascii會大於255。所以,能夠編寫以下的方法來得到以字節爲單位的字符串長度。 解決: public int getWordCount(String s) { int length = 0; for (int i = 0; i < s.length(); i++) { int ascii = Character.codePointAt(s, i); if (ascii >= 0 && ascii <= 255) length++; else length += 2; } return length; } 上面代碼的基本原理是將字符串中全部的非標準字符(雙字節字符)替換成兩個標準字符(**,或其餘的也能夠)。 或者:
public int getWordCount(String s) { s = s.replaceAll("[^\\x00-\\xff]", "**"); int length = s.length(); return length; }
return String.getByte().length() ; return String.getByte("gbk").length() ;
詳細請參考 http://www.cnblogs.com/God-/p/6006749.htmlhtml
幾種編碼格式。java
- ASCII 碼
學過計算機的人都知道 ASCII 碼,總共有 128 個,用一個字節的低 7 位表示,0~31 是控制字符如換行回車刪除等;32~126 是打印字符,能夠經過鍵盤輸入而且可以顯示出來。編程
- ISO-8859-1
128 個字符顯然是不夠用的,因而 ISO 組織在 ASCII 碼基礎上又制定了一些列標準用來擴展 ASCII 編碼,它們是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵蓋了大多數西歐語言字符,全部應用的最普遍。ISO-8859-1 仍然是單字節編碼,它總共能表示 256 個字符。windows
- GB2312
它的全稱是《信息交換用漢字編碼字符集 基本集》,它是雙字節編碼,總的編碼範圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。網絡
- GBK
全稱叫《漢字內碼擴展規範》,是國家技術監督局爲 windows95 所制定的新的漢字內碼規範,它的出現是爲了擴展 GB2312,加入更多的漢字,它的編碼範圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字,它的編碼是和 GB2312 兼容的,也就是說用 GB2312 編碼的漢字能夠用 GBK 來解碼,而且不會有亂碼。編程語言
- GB18030
全稱是《信息交換用漢字編碼字符集》,是我國的強制標準,它多是單字節、雙字節或者四字節編碼,它的編碼與 GB2312 編碼兼容,這個雖然是國家標準,可是實際應用系統中使用的並不普遍。編碼
- UTF-16
說到 UTF 必需要提到 Unicode(Universal Code 統一碼),ISO 試圖想建立一個全新的超語言字典,世界上全部的語言均可以經過這本字典來相互翻譯。可想而知這個字典是多麼的複雜,關於 Unicode 的詳細規範能夠參考相應文檔。Unicode 是 Java 和 XML 的基礎,下面詳細介紹 Unicode 在計算機中的存儲形式。翻譯
UTF-16 具體定義了 Unicode 字符在計算機中存取方法。UTF-16 用兩個字節來表示 Unicode 轉化格式,這個是定長的表示方法,不論什麼字符均可以用兩個字節表示,兩個字節是 16 個 bit,因此叫 UTF-16。UTF-16 表示字符很是方便,每兩個字節表示一個字符,這個在字符串操做時就大大簡化了操做,這也是 Java 以 UTF-16 做爲內存的字符存儲格式的一個很重要的緣由。code
- UTF-8
UTF-16 統一採用兩個字節表示一個字符,雖然在表示上很是簡單方便,可是也有其缺點,有很大一部分字符用一個字節就能夠表示的如今要兩個字節表示,存儲空間放大了一倍,在如今的網絡帶寬還很是有限的今天,這樣會增大網絡傳輸的流量,並且也不必。而 UTF-8 採用了一種變長技術,每一個編碼區域有不一樣的字碼長度。不一樣類型的字符能夠是由 1~6 個字節組成。htm
UTF-8 有如下編碼規則:
- 若是一個字節,最高位(第 8 位)爲 0,表示這是一個 ASCII 字符(00 - 7F)。可見,全部 ASCII 編碼已是 UTF-8 了。
- 若是一個字節,以 11 開頭,連續的 1 的個數暗示這個字符的字節數,例如:110xxxxx 表明它是雙字節 UTF-8 字符的首字節。
- 若是一個字節,以 10 開始,表示它不是首字節,須要向前查找才能獲得當前字符的首字節