Java世界

          學(xué)習(xí)筆記

          常用鏈接

          統(tǒng)計

          積分與排名

          天籟村

          新華網(wǎng)

          雅虎

          最新評論

          java字符串的各種編碼轉(zhuǎn)換

          import java.io.UnsupportedEncodingException;

          /**
          ?* 轉(zhuǎn)換字符串的編碼
          ?*/
          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 轉(zhuǎn)換格式?*/
          ?public static final String UTF_8 = "UTF-8";

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

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

          ?/**?16 位 UCS 轉(zhuǎn)換格式,字節(jié)順序由可選的字節(jié)順序標(biāo)記來標(biāo)識?*/
          ?public static final String UTF_16 = "UTF-16";

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

          ?/**
          ? * 將字符編碼轉(zhuǎn)換成US-ASCII碼
          ? */
          ?public String toASCII(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, US_ASCII);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成ISO-8859-1碼
          ? */
          ?public String toISO_8859_1(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, ISO_8859_1);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成UTF-8碼
          ? */
          ?public String toUTF_8(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_8);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成UTF-16BE碼
          ? */
          ?public String toUTF_16BE(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16BE);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成UTF-16LE碼
          ? */
          ?public String toUTF_16LE(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16LE);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成UTF-16碼
          ? */
          ?public String toUTF_16(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, UTF_16);
          ?}
          ?/**
          ? * 將字符編碼轉(zhuǎn)換成GBK碼
          ? */
          ?public String toGBK(String str) throws UnsupportedEncodingException{
          ??return this.changeCharset(str, GBK);
          ?}
          ?
          ?/**
          ? * 字符串編碼轉(zhuǎn)換的實現(xiàn)方法
          ? * @param str??待轉(zhuǎn)換編碼的字符串
          ? * @param newCharset?目標(biāo)編碼
          ? * @return
          ? * @throws UnsupportedEncodingException
          ? */
          ?public String changeCharset(String str, String newCharset)
          ???throws UnsupportedEncodingException {
          ??if (str != null) {
          ???//用默認(rèn)字符編碼解碼字符串。
          ???byte[] bs = str.getBytes();
          ???//用新的字符編碼生成字符串
          ???return new String(bs, newCharset);
          ??}
          ??return null;
          ?}
          ?/**
          ? * 字符串編碼轉(zhuǎn)換的實現(xiàn)方法
          ? * @param str??待轉(zhuǎn)換編碼的字符串
          ? * @param oldCharset?原編碼
          ? * @param newCharset?目標(biāo)編碼
          ? * @return
          ? * @throws UnsupportedEncodingException
          ? */
          ?public String changeCharset(String str, String oldCharset, String newCharset)
          ???throws UnsupportedEncodingException {
          ??if (str != null) {
          ???//用舊的字符編碼解碼字符串。解碼可能會出現(xiàn)異常。
          ???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("轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String ascii = test.toASCII(str);
          ??System.out.println("轉(zhuǎn)換成US-ASCII碼: " + ascii);
          ??gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);
          ??System.out.println("再把ASCII碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String iso88591 = test.toISO_8859_1(str);
          ??System.out.println("轉(zhuǎn)換成ISO-8859-1碼: " + iso88591);
          ??gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);
          ??System.out.println("再把ISO-8859-1碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf8 = test.toUTF_8(str);
          ??System.out.println("轉(zhuǎn)換成UTF-8碼: " + utf8);
          ??gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);
          ??System.out.println("再把UTF-8碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16be = test.toUTF_16BE(str);
          ??System.out.println("轉(zhuǎn)換成UTF-16BE碼:" + utf16be);
          ??gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16BE碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16le = test.toUTF_16LE(str);
          ??System.out.println("轉(zhuǎn)換成UTF-16LE碼:" + utf16le);
          ??gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16LE碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??System.out.println();
          ??String utf16 = test.toUTF_16(str);
          ??System.out.println("轉(zhuǎn)換成UTF-16碼:" + utf16);
          ??gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK);
          ??System.out.println("再把UTF-16碼的字符串轉(zhuǎn)換成GBK碼: " + gbk);
          ??String s = new String("中文".getBytes("UTF-8"),"UTF-8");
          ??System.out.println(s);
          ?}
          }

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


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

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

          ??????? 當(dāng)我們從數(shù)據(jù)庫中讀文本數(shù)據(jù)時,采用ResultSet.getBytes()方法取得字節(jié)數(shù)組,同樣采用帶編碼方式的字符串構(gòu)造方法即可。

          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");

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

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

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

          評論

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

          感謝分享  回復(fù)  更多評論   

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

          謝謝支持!  回復(fù)  更多評論   

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

          頂~  回復(fù)  更多評論   

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

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

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

          相當(dāng)?shù)挠杏冒。兄x分享  回復(fù)  更多評論   

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

          有些編碼不能直接轉(zhuǎn)換的吧!
            回復(fù)  更多評論   

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

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

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

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

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

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

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

          簡直是不負(fù)責(zé)任呀......全是錯的.......敢不敢看文檔再發(fā)  回復(fù)  更多評論   

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

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

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

          謝謝  回復(fù)  更多評論   

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

          謝了  回復(fù)  更多評論   

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

          謝謝你的幫助!  回復(fù)  更多評論   

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

          都是錯的,完全錯誤。  回復(fù)  更多評論   

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

          ____。色調(diào)  回復(fù)  更多評論   

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

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

          # re: java字符串的各種編碼轉(zhuǎn)換 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  回復(fù)  更多評論   

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

          這簡直是放屁  回復(fù)  更多評論   

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

          dfvgdx  回復(fù)  更多評論   

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

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

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

          怎么轉(zhuǎn)都是亂碼是怎么回事?  回復(fù)  更多評論   

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

          反正我是轉(zhuǎn)成功了,謝謝分享!  回復(fù)  更多評論   

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

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

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

          祝疲鄭牛攏疲埃啊。
            回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 北碚区| 和林格尔县| 铁岭市| 常熟市| 板桥市| 三门峡市| 天峻县| 原平市| 漾濞| 连山| 桂阳县| 益阳市| 东至县| 定州市| 临颍县| 锡林郭勒盟| 大庆市| 平南县| 睢宁县| 高要市| 出国| 修水县| 九龙县| 抚宁县| 侯马市| 平湖市| 泌阳县| 隆德县| 左权县| 海盐县| 闸北区| 汝南县| 获嘉县| 博爱县| 垦利县| 洪江市| 浦东新区| 江源县| 革吉县| 内江市| 舒城县|