java字串編碼轉換

來源:互聯網
上載者:User

    無論是對程式的本地化還是國際化,都會涉及到字元編碼的轉換的問題。尤其在web應用中常常需要處理中文字元,這時就需要進行字串的編碼轉換,將字串編碼轉換為GBK或者GB2312。

一、關鍵技術點:
    1、當前流行的字元編碼格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是專門處理中文編碼的。
    2、String的getBytes方法用於按指定編碼擷取字串的位元組數組,參數指定瞭解碼格式,如果沒有指定解碼格式,則按系統預設編碼格式。
    3、String的“String(bytes[] bs, String charset)”構造方法用於把位元組數組按指定的格式組合成一個字串對象
   
二、執行個體示範:

 

package book.String;

import java.io.UnsupportedEncodingException;

/** *//**
 * 轉換字串的編碼
 * @author joe
 *
 */

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 轉換格式,Litter 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";
   
    public static final String GB2312 = "GB2312";
   
    /** *//** 將字元編碼轉換成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);
    }
   
    /** *//** 將字元編碼轉換成GB2312     */
    public String toGB2312(String str) throws UnsupportedEncodingException ...{
        return this.changeCharset(str,GB2312);
    }
   
    /** *//**
     * 字串編碼轉換的實現方法
     * @param str    待轉換的字串
     * @param newCharset    目標編碼
     */
    public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException ...{
        if(str != null) ...{
            //用預設字元編碼解碼字串。與系統相關,中文windows預設為GB2312
            byte[] bs = str.getBytes();
            return new String(bs, newCharset);    //用新的字元編碼產生字串
        }
        return null;
    }
   
    /** *//**
     * 字串編碼轉換的實現方法
     * @param str    待轉換的字串
     * @param oldCharset    源字元集
     * @param newCharset    目標字元集
     */
    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);
        System.out.println();
       
        String iso88591 = test.toISO_8859_1(str);
        System.out.println("轉換成ISO-8859-1碼:" + iso88591);
        System.out.println();
       
        gbk = test.changeCharset(iso88591, ISO_8859_1, GBK);
        System.out.println("再把ISO-8859-1碼的字串轉換成GBK碼:" + gbk);
        System.out.println();
       
        String utf8 = test.toUTF_8(str);
        System.out.println();
        System.out.println("轉換成UTF-8碼:" + utf8);
        String utf16be = test.toUTF_16BE(str);
        System.out.println("轉換成UTF-16BE碼:" + utf16be);
        gbk = test.changeCharset(utf16be, UTF_16BE, 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, UTF_16LE, GBK);
        System.out.println("再把UTF-16LE編碼的字串轉換成GBK碼:" + gbk);
        System.out.println();
       
        String utf16 = test.toUTF_16(str);
        System.out.println("轉換成UTF-16碼:" + utf16);
        String gb2312 = test.changeCharset(utf16, UTF_16, GB2312);
        System.out.println("再把UTF-16編碼的字串轉換成GB2312碼:" + gb2312);
    }

}
 

輸出結果:

 

str:This is a 中文的 String!
轉換成GBK碼:This is a 中文的 String!

轉換成US-ASCII:This is a ?????? String!

轉換成ISO-8859-1碼:This is a ?????? String!

再把ISO-8859-1碼的字串轉換成GBK碼:This is a 中文的 String!

轉換成UTF-8碼:This is a ????? String!
轉換成UTF-16BE碼:周楳?猠慍????瑲楮朡
再把UTF-16BE編碼的字元轉換成GBK碼:This is a 中文的 String!

轉換成UTF-16LE碼:桔獩槧?????匠牴湩Ⅷ
再把UTF-16LE編碼的字串轉換成GBK碼:This is a 中文的 String!

轉換成UTF-16碼:周楳?猠慍????瑲楮朡
再把UTF-16編碼的字串轉換成GB2312碼:?This is a 中文的 String!
 

三、源碼分析:
    更改字串編碼的步驟為:
    1、調用String的getByte方法對字串進行解碼,得到字串的位元組數組(位元組數組不攜帶任何有關編碼格式的資訊,只有字元才有編碼格式)
    2、根據位元組數組和新的字元編碼構造一個新的String對象,得到的就是按照新的字元編碼產生的字串

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.