亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于JAVA的中文問題

2019-11-18 13:18:56
字體:
來源:轉載
供稿:網友

  一、主題:關于java的中文問題
  JAVA的中文問題比較突出,主要表現在控制面板輸出,jsp頁面輸出和數據庫訪問上。本文盡量避開字體問題,而只談編碼。通過本文,你可以了解JAVA中文問題的由來,問題的解決方法,其中提了一下用JDBC訪問數據庫的方法。
  
  二、問題描述:
  1)在中文W2000中文窗口編譯和運行,用的是國際版的JDK,連接的是中文W2000下的Cp936編碼的SQL SERVER數據庫:
  
  J:/exercise/demo/encode/HelloWorld>make
  Created by XCompiler. PhiloSoft All Rights Reserved.
  Wed May 30 02:54:45 CST 2001
  
  J:/exercise/demo/encode/HelloWorld>run
  Created by XRunner. PhiloSoft All Rights Reserved.
  Wed May 30 02:51:33 CST 2001
  中文
  [B@7bc8b569
  [B@7b08b569
  [B@7860b569
  中文
  中文
  ????
  中文
  中文
  ????
  ??
  ??
  ??
  
  2)假如在中文W2000的西文窗口(編碼為437)下編譯,用JAVA運行則由于無字體而無法正常顯示,假如象上面一樣在中文W2000的中文窗口運行,輸出為:
  
  J:/exercise/demo/encode/HelloWorld>run
  Created by XRunner. PhiloSoft All Rights Reserved.
  Wed May 30 02:51:33 CST 2001
  ????
  [B@7bc0b66a
  [B@7b04b66a
  [B@7818b66a
  ????
  ????
  ????
  ????
  ????
  ????
  中文
  中文
  ????
  
  三)分析
  1)出現有亂碼(也就是?)。由于只出現?而沒出現小方框,說明只是編碼有問題,而不是字體問題。 在編碼中,假如從一種字符集轉換到別一種字符集,比較典型的是從GB2312轉換到ISO8859_1(即ASCII),那么很多漢字(半個漢字)是無法映射到西文字符中去的,在這種情形下,系統就把這些字符用?代替。同樣,也存在小字符集無法到大字符集的情況,具體原因這里就不詳談了。
  
  2)出現了中文環境編譯,中文環境運行時漢字顯示有正確也有不正確的地方,同樣,在西文環境下編譯,在中文環境下運行時也出現類似情況。這是由于自動(默認)或手工(也就new String(bytes[,encode])和bytes getBytes([encode]))轉碼的結果。
  
  2.1)在JAVA源文件-->JAVAC-->Class-->Java-->getBytes()-->new String()-->顯示的過程中,每一步都有編碼的轉換過程,這個過程總是存在的,只是有的時候用默認的參數進行。下面我們一步一步分析為什么出現上面的情形。
  
  2.2)這里是源代碼:
  
  HelloWorld.java:
  ------------------------
  public class HelloWorld
  {
  public static void main(String[] argv){
  try{
  System.out.  System.out.println("中文".getBytes());//2
  System.out.println("中文".getBytes("GB2312"));//3
  System.out.println("中文".getBytes("ISO8859_1"));//4
  
  System.out.println(new String("中文".getBytes()));//5
  System.out.println(new String("中文".getBytes(),"GB2312"));//6
  System.out.println(new String("中文".getBytes(),"ISO8859_1"));//7
  
  System.out.println(new String("中文".getBytes("GB2312")));//8
  System.out.println(new String("中文".getBytes("GB2312"),"GB2312"));//9
  System.out.println(new
  
  String("中文".getBytes("GB2312"),"ISO8859_1"));//10
  
  System.out.println(new String("中文".getBytes("ISO8859_1")));//11
  System.out.println(new
  
  String("中文".getBytes("ISO8859_1"),"GB2312"));//12
  System.out.println(new
  
  String("中文".getBytes("ISO8859_1"),"ISO8859_1"));//13
  }
  catch(Exception e){
  e.printStackTrace();
  }
  }
  }
  
  為了方便起見,在每個轉換的后面加了操作序號,分別為1,2,...,13。
  
  2.3)需要說明的是,JAVAC是以系統默認編碼讀入源文件,然后按UNICODE進行編碼的。在JAVA運行的時候,JAVA也是采用UNICODE編碼的,并且默認輸入和輸出的都是操作系統的默認編碼,也就是說在new String(bytes[,encode])中,系統認為輸入的是編碼為encode的字節流,換句話說,假如按encode來翻譯bytes才能得到正確的結果,這個結果最后要在JAVA中保存,它還是要從這個encode轉換成Unicode,也就是說有bytes-->encode字符-->Unicode字符的轉換;而在String.getBytes([encode])中,系統要做一個Unicode字符-->encode字符-->bytes的轉換。
  
  在這個例子中,除那個英文窗口編碼的時候除外,其實情形下默認編碼都是GBK(在本例中,我們暫且把GBK和GB2312等同看待)。
  
  2.4)由于在未指明在上面的兩個用代碼實現的轉換中,假如未指定encode,系統將采用默認的編碼(這里為GBK),我們認為上面的5,6,7和8,9,10是一樣的,8和9、11和12也是一樣的,所以我們在討論中將只討論1,9,10,12,13。其中的2,3,4只是用于測試,不在我們的討論范圍之內。
  
  2.5)下面我們來跟蹤程序中的“中”字的轉換歷程,我們先說在中文窗口下作的編譯和運行過程,注重在下面的字母下標中,我有意識地使用了一些數字,以表示相同,相異還是相關2.5.1)我們先以上面的13個代碼段中的的代碼9為例:
  
  步驟 內容 地點 說明
  01: C1 HelloWorld.java C1泛指一個GBK字符
  02: U1 JAVAC讀取 U1泛指一個Unicode字符
  03: C1 getBytes()第一步 JAVA先和
操作系統交流
  04: B1,B2 getBytes()第二步 然后返回字節數組
  05: C1 new String()第一步 JAVA先和操作系統交流
  06: U1 new String()第二步 然后返回字符
  07: C1 println(String) 能顯示“中”字,內容和原來的相同
  
  2.5.2)然后再以代碼段10為例,我們注重到只是:
  
  步驟 內容 地點 說明
  01: C1 HelloWorld.java C1泛指一個GBK字符
  02: U1 JAVAC讀取 U1泛指一個Unicode字符
  03: C1 getBytes()第一步 JAVA先和操作系統交流
  04: B1,B2 getBytes()第二步 然后返回字節數組
  05: C3,C4 new String()第一步 JAVA先和操作系統交流,這時解析錯誤
  06: U5,U6 new String()第二步 然后返回字符
  07: C3,C4 println(String) 由于中字給分成了兩半,在ISO8859_1中剛好也沒有字符
  
  能映射上,所以顯示為“??”。在上面的示例中,
  “中文”兩個字就顯示為“????”
  2.5.3)在完全中文模式下的其它情形類似,我就不多說了
  
  2.6)我們接著看為什么在西文DOS窗口下編譯出來的類在中文窗口下也出現類似情形,非凡是為什么居然有的情形下還能正確顯示漢字。
  
  2.6.1)我們還是先以代碼段9為例:
  
  步驟 內容 地點 說明
  01: C1C2 HelloWorld.java C1C2分別泛指一個ISO8859_1字符,“中”字被拆開
  02: U3U4 JAVAC讀取 U1U2泛指一個Unicode字符
  03: C5C6 getBytes()第一步 JAVA先和操作系統交流,這時解析錯誤
  04: B5B6B7B8 getBytes()第二步 然后返回字節數組
  05: C5C6 new String()第一步 JAVA先和操作系統交流
  06: U3U4 new String()第二步 然后返回字符
  07: C5C6 println(String) 雖然同是兩個字符,但已不是最初的“兩個ISO8859_1字
  
  符”,而是“兩個BGK字符”,“中”顯示成了“??”
  而“中文”就顯示成了“????”
  
  2.6.2)下面我們以代碼段12為例,因為它能正確顯示漢字
  
  步驟 內容 地點 說明
  
  01: C1C2 HelloWorld.java C1C2分別泛指一個ISO8859_1字符,“中”字被拆開
  02: U3U4 JAVAC讀取 U1U2泛指一個Unicode字符
  03: C1C2 getBytes()第一步 JAVA先和操作系統交流(注重還是正確的哦?。?
  04: B5B6 getBytes()第二步 然后返回字節數組(這是很要害的一步?。?
  05: C12 new String()第一步 JAVA先和操作系統交流(這是更要害的一步,JAVA已經知道B5B6要解析成一個漢字!)
  06: U7 new String()第二步 然后返回字符(真是一個項兩!U7包含了U3U4的信息)
  07: C12 println(String) 這就原來的“中”字,很委屈被JAVAC冤枉了一回,不過被程序員撥亂反正了一下!當然,“中文”兩個字都能正確顯示了!
  
  3)那為什么有的時候用JDBC的
  new String(Recordset.getBytes(int)[,encode])
  Recordset.getSting(int)
  Recordset.setBytes(String.getBytes([encode]))
  和
  Recordset.setString(String)
  的時候會出現亂碼了呢?
  
  其實問題就出現在編寫JDBC的的也考慮了編碼問題,它從數據庫讀取數據后,可能自作主張做了一個從GB2312(默認編碼)到Unicode的轉換,我的這個WebLogic For SQL Server的JDBC Driver就是這樣的,當我讀字串的時候,發出讀到的不是正確的漢字,可恨的是我卻可以直接寫漢字字串,這讓人多少有點難以接受!
  也就是說,我們不得不在讀或寫的時候進行轉碼,盡管這個轉碼有的時候不是那么明顯,這是因為我們使用了默認的編碼進行轉碼。JDBC Driver

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产原创欧美精品| 国产精品视频免费观看www| 国产精品一区二区久久久| 日韩中文在线视频| 国产精品香蕉在线观看| 国产精品美女无圣光视频| 亚洲精品福利在线| 国产91在线高潮白浆在线观看| 日日狠狠久久偷偷四色综合免费| 国产午夜精品全部视频播放| 国产日韩精品综合网站| 日韩电影中文 亚洲精品乱码| 欧美激情一区二区三区在线视频观看| 亚洲第一免费播放区| 九九精品在线播放| 亚洲直播在线一区| 欧美成人性色生活仑片| 高清在线视频日韩欧美| 国产成人精品久久二区二区91| 国产精品三级在线| 日本一区二区三区四区视频| 久久艹在线视频| 国产区精品在线观看| 国产成人鲁鲁免费视频a| 欧美一区亚洲一区| 九九热精品视频| 国产成人精品久久久| 久久久噜久噜久久综合| 亚洲欧美日韩天堂| 亚洲精品白浆高清久久久久久| 亚洲一区二区三区毛片| 色综合影院在线| 91久久国产婷婷一区二区| 91精品啪在线观看麻豆免费| 日韩有码在线观看| 一区二区亚洲精品国产| 在线电影欧美日韩一区二区私密| 欧美成人精品不卡视频在线观看| 疯狂做受xxxx欧美肥白少妇| 欧美日韩国产区| 九色精品免费永久在线| 久久影视电视剧凤归四时歌| 欧美日韩一区二区三区在线免费观看| 国产精品大陆在线观看| 日韩欧美一区二区三区久久| 日韩大胆人体377p| 91精品视频网站| 亚洲少妇激情视频| 成人免费激情视频| 中文日韩在线观看| 欧美成人sm免费视频| 国内外成人免费激情在线视频网站| 91av网站在线播放| 97久久久免费福利网址| 亚洲人成网站免费播放| 国产成人精品亚洲精品| 免费99精品国产自在在线| 91精品国产自产91精品| 午夜精品一区二区三区在线| 国产一区二区三区精品久久久| 成人久久久久久久| 韩国福利视频一区| 98精品国产高清在线xxxx天堂| 成人午夜在线影院| 欧美中文字幕在线| 色综合91久久精品中文字幕| 亚洲福利视频专区| 欧洲成人在线视频| 亚洲第一精品夜夜躁人人爽| 欧美性高潮在线| 久久久人成影片一区二区三区| 国产福利视频一区二区| 日本aⅴ大伊香蕉精品视频| 久久久久久亚洲| 中文字幕亚洲欧美日韩高清| 成人在线观看视频网站| 欧美贵妇videos办公室| 国产精品亚洲аv天堂网| 国产日韩中文字幕在线| 97精品欧美一区二区三区| 色婷婷亚洲mv天堂mv在影片| 亚洲精品一区二区久| 98视频在线噜噜噜国产| 亚洲va久久久噜噜噜| 亚洲高清免费观看高清完整版| 欧美性理论片在线观看片免费| 国产丝袜一区视频在线观看| 亚洲精品动漫久久久久| 亚洲精品一区中文| 精品小视频在线| 亚洲国产又黄又爽女人高潮的| 久久影视电视剧凤归四时歌| 2019中文字幕在线免费观看| 亚洲伊人久久综合| 2019中文字幕在线观看| 久久久久久18| 久久精品福利视频| 国产精品色婷婷视频| 国产狼人综合免费视频| 亚洲www在线观看| www国产精品com| 亚洲第一页自拍| 欧美亚洲国产日本| 国产成人一区二| 日韩精品www| 秋霞成人午夜鲁丝一区二区三区| 亚洲精品成人网| 日本久久久久久久久久久| 91av在线免费观看| 国产香蕉精品视频一区二区三区| 精品香蕉一区二区三区| 97精品视频在线| 夜夜嗨av色综合久久久综合网| 欧美日韩不卡合集视频| 日韩电影免费观看在线| 黑人极品videos精品欧美裸| 精品五月天久久| 国产美女精品视频| 国产精品久久国产精品99gif| 国产精品一二三视频| 亚洲色图综合网| 91精品国产乱码久久久久久久久| xvideos国产精品| 91九色视频导航| 亚洲午夜色婷婷在线| 欧美日韩在线观看视频小说| 国产精品视频自在线| 亚洲一区二区三区在线视频| 久久久精品视频在线观看| 国产美女精品免费电影| 精品久久久香蕉免费精品视频| 亚洲综合色激情五月| 日韩中文字幕视频在线| 91亚洲精品一区二区| 亚洲自拍中文字幕| 欧美电影在线观看高清| 国产成人精品视频在线观看| 久久久av亚洲男天堂| 午夜精品视频网站| 日韩理论片久久| 久久精品精品电影网| 国产精品久久久久久久久久| 欧美亚洲另类视频| 91高清视频免费| 国产精品一区二区三区成人| 亚洲欧美国产高清va在线播| 亚洲精品视频在线观看视频| 成人黄色中文字幕| 久久精品影视伊人网| 中文字幕日韩av综合精品| 成人观看高清在线观看免费| 亚洲一区二区中文字幕| 久久不射热爱视频精品| 欧美一区二区三区免费视| 久久中文字幕一区| 亚洲免费人成在线视频观看| 欧美怡红院视频一区二区三区| 欧美午夜视频一区二区| 97婷婷大伊香蕉精品视频| 久久久99久久精品女同性| 国产成人精品av| 成人av色在线观看| 欧美xxxx18性欧美| 久久99精品久久久久久噜噜|