Java中文問題詳解(轉)
Java中文問題詳解(轉)[@more@]我來說一下tomcat如何實現JSP的你就明白了。 預備知識: 1.位元組和unicode Java核心是unicode的,就連class檔案也是,但是很多媒體,包括檔案/流的儲存方式 是使用位元組流的。 因此Java要對這些位元組流經行轉化。char是unicode的,而byte是位元組. Java中byte/char互轉的函式在sun.io的包中間有。其中ByteToCharConverter類是中排程, 可以用來告訴你,你用的Convertor。其中兩個很常用的靜態函式是 public static ByteToCharConverter getDefault() ; public static ByteToCharConverter getConverter(String encoding); 如果你不指定converter,則系統會自動使用當前的Encoding,GB平臺上用GBK,EN平臺上用 8859_1 我們來就一個簡單的例子: "你"的gb碼是:0xC4E3 ,unicode是0x4F60 你用: --encoding="gb2312"; --byte b[]={(byte)u00c4,(byte)u00E3}; --convertor=ByteToCharConverter.getConverter(encoding); --char [] c=converter.convertAll(b); --for(int i=0;i --{ -- System.out.println(Integer.toHexString(c[i])); --} --列印出來是0x4F60 --但是如果使用8859_1的編碼,列印出來是 --0x00C4,0x00E3 ----例1 反過來: --encoding="gb2312"; char c[]={u4F60}; convertor=ByteToCharConverter.getConverter(encoding); --byte [] b=converter.convertAll(c); --for(int i=0;i --{ -- System.out.println(Integer.toHexString(b[i])); --} --列印出來是:0xC4,0xE3 ----例2 --如果用8859_1就是0x3F,?號,表示無法轉化 -- 很多中文問題就是從這兩個最簡單的類派生出來的。而卻有很多類 不直接支援把Encoding輸入,這給我們帶來諸多不便。很多程式難得用encoding 了,直接用default的encoding,這就給我們移植帶來了很多困難 -- 2.UTF-8 --UTF-8是和Unicode一一對應的,其實現很簡單 -- -- 7位的Unicode: 0 _ _ _ _ _ _ _ --11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ --16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ --21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ --大多數情況是隻使用到16位以下的Unicode: --"你"的gb碼是:0xC4E3 ,unicode是0x4F60 --我們還是用上面的例子 -- --例1:0xC4E3的二進位制: -- -- 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 -- -- 由於只有兩位我們按照兩位的編碼來排,但是我們發現這行不通, -- -- 因為第7位不是0因此,返回"?" -- -- -- --例2:0x4F60的二進位制: -- -- 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 -- -- 我們用UTF-8補齊,變成: -- -- 11100100 10111101 10100000 -- -- E4--BD-- A0 -- -- 於是返回0xE4,0xBD,0xA0 -- -- 3.String和byte[] --String其實核心是char[],然而要把byte轉化成String,必須經過編碼。 --String.length()其實就是char陣列的長度,如果使用不同的編碼,很可 --能會錯分,造成散字和亂碼。 --例: ----byte [] b={(byte)u00c4,(byte)u00e3}; ----String str=new String(b,encoding); ---- ----如果encoding=8859_1,會有兩個字,但是encoding=gb2312只有一個字 ---- --這個問題在處理分頁是經常發生 4.Reader,Writer/InputStream,OutputStream --Reader和Writer核心是char,InputStream和OutputStream核心是byte。 --但是Reader和Writer的主要目的是要把Char讀/寫InputStream/OutputStream --一個reader的例子: --檔案test.txt只有一個"你"字,0xC4,0xE3-- --String encoding=; --InputStreamReader reader=new InputStreamReader( ----new FileInputStream("text.txt"),encoding); --char []c=new char[10]; --int length=reader.read(c); --for(int i=0;i----System.out.println(c[i]); --如果encoding是gb2312,則只有一個字元,如果encoding=8859_1,則有兩個字元 -------- -- -- ---- 2.我們要對Java的編譯器有所瞭解: --javac -encoding 我們常常沒有用到ENCODING這個引數。其實Encoding這個引數對於跨平臺的操作是很重要的。 如果沒有指定Encoding,則按照系統的預設Encoding,gb平臺上是gb2312,英文平臺上是ISO8859_1。 --Java的編譯器實際上是呼叫sun.tools.javac.Main的類,對檔案進行編譯,這個類 -- 有compile函式中間有一個encoding的變數,-encoding的引數其實直接傳給encoding變數。 編譯器就是根據這個變數來讀取java檔案的,然後把用UTF-8形式編譯成class檔案。 一個例子: --public void test() --{ ----String str="你"; ----FileWriter write=new FileWriter("test.txt"); ----write.write(str); ----write.close(); --} ----例3 --如果用gb2312編譯,你會找到E4 BD A0的欄位 -- --如果用8859_1編譯, --00C4 00E3的二進位制: --00000000 11000100 00000000 11100011-- --因為每個字元都大於7位,因此用11位編碼: --11000001 10000100 11000011 10100011 --C1-- 84-- C3-- A3 --你會找到C1 84 C3 A3 -- 但是我們往往忽略掉這個引數,因此這樣往往會有跨平臺的問題: -- 例3在中文平臺上編譯,生成ZhClass -- 例3在英文平臺上編譯,輸出EnClass --1. ZhClass在中文平臺上執行OK,但是在英文平臺上不行 --2. EnClass在英文平臺上執行OK,但是在中文平臺上不行 原因: --1.在中文平臺上編譯後,其實str在執行態的char[]是0x4F60, ---- --在中文平臺上執行,FileWriter的預設編碼是gb2312,因此 --CharToByteConverter會自動用呼叫gb2312的converter,把str轉化
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-946003/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中文問題詳解(高手必讀) (轉)Java
- JAVA常見中文問題的解決方案(轉)Java
- Java 解決中文亂碼問題Java
- java 中文問題Java
- java中解決request中文亂碼問題Java
- JAVA中文比較問題的分析和解決 (轉)Java
- Java 中文 亂碼問題Java
- Java解決Itext pdf中文不顯示問題Java
- 用java解壓zip檔案的中文問題Java
- LILO啟動問題詳解 (轉)
- Python詞雲庫wordcloud中文顯示問題詳解PythonCloud
- JAVA的中文編碼問題Java
- JSP顯示中文問題的解決方案(轉)JS
- getParameter方法的中文問題【轉】
- java反射詳解(轉)Java反射
- Java IO詳解(轉)Java
- 系統管理命令中文詳解(轉)
- MySQL 中文 like 問題解決MySql
- 解決中文亂碼問題
- jive中文問題解決方案
- Java,MySQL中文亂碼問題求教JavaMySql
- Java/J2EE中文問題Java
- java處理中文亂碼問題Java
- 解決中文問題的幾個常用的函式 (轉)函式
- java轉型問題Java
- 關於JDK1.2的JDBC中文問題的解決 (轉)JDKJDBC
- JDK1.2關於JDBC中文問題的解決方案 (轉)JDKJDBC
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- 解決localdb中文智慧的問題
- RDSSQLSERVER解決中文亂碼問題SQLServer
- 解決MySQL中文亂碼問題MySql
- Tomcat下中文問題解決Tomcat
- 暫時解決的中文問題
- Java GBK 中文亂碼問題分析Java
- Java Web開發中文亂碼問題JavaWeb
- 解決plsql中中文亂碼問題SQL
- [轉]Java執行緒詳解Java執行緒