Java世界

          學習筆記

          常用鏈接

          統計

          積分與排名

          天籟村

          新華網

          雅虎

          最新評論

          java字符串的各種編碼轉換

          import java.io.UnsupportedEncodingException;

          /**
          ?* 轉換字符串的編碼
          ?*/
          public class ChangeCharset {
          ?/**?7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁塊?*/
          ?public static final String US_ASCII = "US-ASCII";

          ?/**?ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1?*/
          ?public static final String ISO_8859_1 = "ISO-8859-1";

          ?/**?8 位 UCS 轉換格式?*/
          ?public static final String UTF_8 = "UTF-8";

          ?/**?16 位 UCS 轉換格式,Big Endian(最低地址存放高位字節)字節順序?*/
          ?public static final String UTF_16BE = "UTF-16BE";

          ?/**?16 位 UCS 轉換格式,Little-endian(最高地址存放低位字節)字節順序?*/
          ?public static final String UTF_16LE = "UTF-16LE";

          ?/**?16 位 UCS 轉換格式,字節順序由可選的字節順序標記來標識?*/
          ?public static final String UTF_16 = "UTF-16";

          ?/**?中文超大字符集?*/
          ?public static final String GBK = "GBK";

          ?/**
          ? * 將字符編碼轉換成US-ASCII碼
          ? */
          ?public String toASCII(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, US_ASCII);
          ?}
          ?/**
          ? * 將字符編碼轉換成ISO-8859-1碼
          ? */
          ?public String toISO_8859_1(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, ISO_8859_1);
          ?}
          ?/**
          ? * 將字符編碼轉換成UTF-8碼
          ? */
          ?public String toUTF_8(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_8);
          ?}
          ?/**
          ? * 將字符編碼轉換成UTF-16BE碼
          ? */
          ?public String toUTF_16BE(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16BE);
          ?}
          ?/**
          ? * 將字符編碼轉換成UTF-16LE碼
          ? */
          ?public String toUTF_16LE(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16LE);
          ?}
          ?/**
          ? * 將字符編碼轉換成UTF-16碼
          ? */
          ?public String toUTF_16(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16);
          ?}
          ?/**
          ? * 將字符編碼轉換成GBK碼
          ? */
          ?public String toGBK(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, GBK);
          ?}
          ?
          ?/**
          ? * 字符串編碼轉換的實現方法
          ? * @param str??待轉換編碼的字符串
          ? * @param newCharset?目標編碼
          ? * @return
          ? * @throws UnsupportedEncodingException
          ? */
          ?public String changeCharset(String str, String newCharset)
          ???throws UnsupportedEncodingException {
          ??if (str != null) {
          ???//用默認字符編碼解碼字符串。
          ???byte[] bs = str.getBytes();
          ???//用新的字符編碼生成字符串
          ???return new String(bs, newCharset);
          ??}
          ??return null;
          ?}
          ?/**
          ? * 字符串編碼轉換的實現方法
          ? * @param str??待轉換編碼的字符串
          ? * @param oldCharset?原編碼
          ? * @param newCharset?目標編碼
          ? * @return
          ? * @throws UnsupportedEncodingException
          ? */
          ?public String changeCharset(String str, String oldCharset, String newCharset)
          ???throws UnsupportedEncodingException {
          ??if (str != null) {
          ???//用舊的字符編碼解碼字符串。解碼可能會出現異常。
          ???byte[] bs = str.getBytes(oldCharset);
          ???//用新的字符編碼生成字符串
          ???return new String(bs, newCharset);
          ??}
          ??return null;
          ?}

          ?public static void main(String[] args) throws UnsupportedEncodingException {
          ??ChangeCharset test = new ChangeCharset();
          ??String str = "This is a 中文的 String!";
          ??System.out.println("str: " + str);
          ??String gbk = test.toGBK(str);
          ??System.out.println("轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String ascii = test.toASCII(str);
          ??System.out.println("轉換成US-ASCII碼: " + ascii);
          ??gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);
          ??System.out.println("再把ASCII碼的字符串轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String iso88591 = test.toISO_8859_1(str);
          ??System.out.println("轉換成ISO-8859-1碼: " + iso88591);
          ??gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);
          ??System.out.println("再把ISO-8859-1碼的字符串轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf8 = test.toUTF_8(str);
          ??System.out.println("轉換成UTF-8碼: " + utf8);
          ??gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);
          ??System.out.println("再把UTF-8碼的字符串轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16be = test.toUTF_16BE(str);
          ??System.out.println("轉換成UTF-16BE碼:" + utf16be);
          ??gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16BE碼的字符串轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16le = test.toUTF_16LE(str);
          ??System.out.println("轉換成UTF-16LE碼:" + utf16le);
          ??gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16LE碼的字符串轉換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16 = test.toUTF_16(str);
          ??System.out.println("轉換成UTF-16碼:" + utf16);
          ??gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16碼的字符串轉換成GBK碼: " + gbk);
          ??String s = new String("中文".getBytes("UTF-8"),"UTF-8");
          ??System.out.println(s);
          ?}
          }

          ------------------------------------------------------------------------------------------------------------------


          ??????? java中的String類是按照unicode進行編碼的,當使用String(byte[] bytes, String encoding)構造字符串時,encoding所指的是bytes中的數據是按照那種方式編碼的,而不是最后產生的String是什么編碼方式,換句話說,是讓系統把bytes中的數據由encoding編碼方式轉換成unicode編碼。如果不指明,bytes的編碼方式將由jdk根據操作系統決定。

          ??????? 當我們從文件中讀數據時,最好使用InputStream方式,然后采用String(byte[] bytes, String encoding)指明文件的編碼方式。不要使用Reader方式,因為Reader方式會自動根據jdk指明的編碼方式把文件內容轉換成unicode編碼。

          ??????? 當我們從數據庫中讀文本數據時,采用ResultSet.getBytes()方法取得字節數組,同樣采用帶編碼方式的字符串構造方法即可。

          ResultSet rs;
          bytep[] bytes = rs.getBytes();
          String str = new String(bytes, "gb2312");

          不要采取下面的步驟。

          ResultSet rs;
          String str = rs.getString();
          str = new String(str.getBytes("iso8859-1"), "gb2312");

          ??????? 這種編碼轉換方式效率底。之所以這么做的原因是,ResultSet在getString()方法執行時,默認數據庫里的數據編碼方式為iso8859-1。系統會把數據依照iso8859-1的編碼方式轉換成unicode。使用str.getBytes("iso8859-1")把數據還原,然后利用new String(bytes, "gb2312")把數據從gb2312轉換成unicode,中間多了好多步驟。

          ??????? 從HttpRequest中讀參數時,利用reqeust.setCharacterEncoding()方法設置編碼方式,讀出的內容就是正確的了。

          posted on 2008-03-27 15:03 Rabbit 閱讀(213725) 評論(25)  編輯  收藏

          評論

          # re: java字符串的各種編碼轉換 2008-11-19 10:47 邀月

          感謝分享  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2008-11-19 15:21 rabbit

          謝謝支持!  回復  更多評論   

          # re: java字符串的各種編碼轉換 2008-12-02 16:44 3分毒

          頂~  回復  更多評論   

          # re: java字符串的各種編碼轉換 2009-03-20 15:27 清閑散人

          inputstreamReader 可以直接指定編碼的……  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2009-03-23 18:13 yxw

          相當的有用啊,感謝分享  回復  更多評論   

          # re: java字符串的各種編碼轉換 2009-07-24 11:24 1111

          有些編碼不能直接轉換的吧!
            回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2009-07-24 13:55 Rabbit

          具體情況具體分析,不一定全部適用。  回復  更多評論   

          # re: java字符串的各種編碼轉換 2009-09-02 15:46 Greale

          "當使用String(byte[] bytes, String encoding)構造字符串時,encoding所指的是bytes中的數據是按照那種方式編碼的,而不是最后產生的String是什么編碼方"
          完全錯誤,不要誤導讀者.  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2009-09-03 08:34 Rabbit

          @Greale
          請加以測試給出結論,請查看String str = new String(bytes, "gb2312");這個字符類的原代碼即可得出答案。  回復  更多評論   

          # re: java字符串的各種編碼轉換 2009-11-06 13:24 tayoto

          簡直是不負責任呀......全是錯的.......敢不敢看文檔再發  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2009-12-06 22:28 wolf

          @Greale
          我來說句,下面這個來自jdk的文檔,
          String(byte[] bytes, String charsetName)
          構造一個新的 String,方法是使用指定的字符集解碼指定的字節數組
          rabbit是對的。  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2009-12-07 16:47 dong

          謝謝  回復  更多評論   

          # re: java字符串的各種編碼轉換 [未登錄] 2010-02-11 10:24 lbom

          謝了  回復  更多評論   

          # re: java字符串的各種編碼轉換 2011-04-02 13:51 tw

          謝謝你的幫助!  回復  更多評論   

          # 錯的,大家不要照搬 2011-05-25 10:37 someone

          都是錯的,完全錯誤。  回復  更多評論   

          # re: java字符串的各種編碼轉換 2012-06-06 21:50 chenliang

          ____。色調  回復  更多評論   

          # re: java字符串的各種編碼轉換 2012-08-18 16:32 陳心

          [fts=6][ftf=Wingdings]?[/ft][/ft][/M]  回復  更多評論   

          # re: java字符串的各種編碼轉換 2012-10-13 00:46 Ricky

          CHANKWOON KAY¥?¥Í/¤p©j
          ¿Dªù®æÄõ°s©±?¬¨ì§Aªº–q©?¥Ó∏?.
          ¥H¤U¬O§Aªº–q©?¸ê®Æ:
          ©m?W: CHAN KWOON KAY
          Ápµ¸’q¸Ü:
          ’q¶l?a§}: kwoonkay@gmail.com
          ¶Ç¯u:
          ¤J?í¤é´Á: 2013?~02¤ë10¤é
          °h©?¤é´Á: 2013?~02¤ë11¤é
          ¯è¯Z¸ê®Æ:
          ©?¶¡Ã?«¬©MπÆ¥Ø
          ºô¤W¯S´f®MÀ\: 1 ¶¡
          π?·Ç«È©?: 1 ¶¡
          »¨µØ«È©?: 0 ¶¡
          °ª¯Å«È©?: 0 ¶¡
          ®a®x«È©?: 0 ¶¡
          ?æ¬F®M©?: 0 ¶¡
          ·Rºû©Ô®M©?: 0 ¶¡
          ©?¶¡¯S§O–n¨D:
          ¥Ó∏?¤é´Á: 2012-10-13 12:33

          ¥»’q¶l¥Ñ¿Dªù®æÄõ°s©±ºô¯¸±H¥X¡C ®æÄõ°s©±Ápµ¸¸ê®Æ:
          ?a§}: ¤¤°ê ¿Dªù?®¥J’ÅπÖ§ÈÁ`·?°¨¸ô822¸’
          ’q¸Ü: (853) 821666 ¶Ç¯u: (853) 820333
          §K¶O–q©?’q¸Ü: 800 - 903295
          §K¶O–q©?¶Ç¯u: 800 - 903296  回復  更多評論   

          # re: java字符串的各種編碼轉換 2012-11-23 15:08 阿斯頓

          這簡直是放屁  回復  更多評論   

          # re: java字符串的各種編碼轉換 2013-05-05 15:57 dsx

          dfvgdx  回復  更多評論   

          # re: java字符串的各種編碼轉換 2014-04-25 16:37 最代碼

          最代碼分享了其中的代碼,分享萬能java字符串編碼轉換工具類,地址:http://www.zuidaima.com/share/1795356301560832.htm  回復  更多評論   

          # re: java字符串的各種編碼轉換 2014-05-12 13:24 性感的咸鴨蛋

          怎么轉都是亂碼是怎么回事?  回復  更多評論   

          # re: java字符串的各種編碼轉換 2014-07-29 10:37 feilian09

          反正我是轉成功了,謝謝分享!  回復  更多評論   

          # re: java字符串的各種編碼轉換 2014-11-04 17:32 zuidaima

          java字符串操作教程代碼實例下載:http://zuidaima.com/share/k%E5%AD%97%E7%AC%A6%E4%B8%B2-p1-s1.htm  回復  更多評論   

          # re: java字符串的各種編碼轉換 2014-12-01 22:07 得得得

          祝疲鄭牛攏疲埃啊。
            回復  更多評論   


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


          網站導航:
           
          主站蜘蛛池模板: 昆明市| 宁化县| 孝义市| 台中市| 威远县| 西安市| 措美县| 康乐县| 德庆县| 封丘县| 尚志市| 灵丘县| 临高县| 法库县| 合阳县| 开阳县| 抚远县| 思南县| 久治县| 宿迁市| 岑溪市| 孟连| 昆山市| 盐津县| 昌都县| 陈巴尔虎旗| 麦盖提县| 德州市| 天门市| 象州县| 沅陵县| 永善县| 苍溪县| 江永县| 江西省| 信宜市| 镇江市| 宣化县| 永昌县| 德州市| 唐海县|