<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0
    package example.encoding;

    import java.io.UnsupportedEncodingException;

    /**
     * The Class GetCharTest.
     
    */

    public class GetCharTest {

        
    /**
         * The main method.
         * 
         * 
    @param args the arguments
         
    */

        
    public static void main(String args[]) {
            String content 
    = "中文";
            String defaultEncoding 
    = System.getProperty("file.encoding");
            String defaultLnaguage 
    = System.getProperty("user.language");
            System.out.println(
    "System default encoding --- " + defaultEncoding);
            System.out.println(
    "System default language --- " + defaultLnaguage);

            GetCharTest tester 
    = new GetCharTest();
            tester.getCharWithDefaultEncoding(content);
            tester.getCharWithGivenEncoding(content, 
    "ISO-8859-1");
            tester.getCharWithGivenEncoding(content, 
    "GBK");
            tester.getCharWithGivenEncoding(content, 
    "UTF-8");
        }


        
    /**
         * Gets the char with default encoding.
         * 
         * 
    @param content the content
         * 
         * 
    @return the char with default encoding
         
    */

        
    public void getCharWithDefaultEncoding(String content) {
            System.out.println(
    "\nGet characters with default encoding\n");
            printCharArray(content);
        }


        
    /**
         * Gets the char with given encoding.
         * 
         * 
    @param content the content
         * 
    @param encoding the encoding
         * 
         * 
    @return the char with given encoding
         
    */

        
    public void getCharWithGivenEncoding(String content, String encoding) {
            System.out.println(
    "\nGet characters with given encoding : " + encoding
                    
    + "\n");
            
    try {
                String encodedString 
    = new String(content.getBytes(), encoding);
                printCharArray(encodedString);
            }
     catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        }


        
    /**
         * Prints the char array.
         * 
         * 
    @param inStr the in str
         
    */

        
    public void printCharArray(String inStr) {
            
    char[] charArray = inStr.toCharArray();

            
    for (int i = 0; i < inStr.length(); i++{
                
    byte b = (byte) charArray[i];
                
    short s = (short) charArray[i];
                String hexB 
    = Integer.toHexString(b).toUpperCase();
                String hexS 
    = Integer.toHexString(s).toUpperCase();
                StringBuffer sb 
    = new StringBuffer();

                
    // print char
                sb.append("char[");
                sb.append(i);
                sb.append(
    "]='");
                sb.append(charArray[i]);
                sb.append(
    "'\t");

                
    // byte value
                sb.append("byte=");
                sb.append(b);
                sb.append(
    " \\u");
                sb.append(hexB);
                sb.append(
    '\t');

                
    // short value
                sb.append("short=");
                sb.append(s);
                sb.append(
    " \\u");
                sb.append(hexS);
                sb.append(
    '\t');

                
    // Unicode Block
                sb.append(Character.UnicodeBlock.of(charArray[i]));

                System.out.println(sb.toString());
            }

            System.out.println(
    "\nCharacters length: " + charArray.length);
        }


    }

    【1】在中文平臺(tái)下,測試的結(jié)果如下:

    System default encoding --- GBK
    System default language --- zh

    Get characters with default encoding

    char[0]='中' byte=45 \u2D short=20013 \u4E2D CJK_UNIFIED_IDEOGRAPHS
    char[1]='文' byte=-121 \uFFFFFF87 short=25991 \u6587 CJK_UNIFIED_IDEOGRAPHS

    Characters length: 2

    Get characters with given encoding : ISO-8859-1

    char[0]='?' byte=-42 \uFFFFFFD6 short=214 \uD6 LATIN_1_SUPPLEMENT
    char[1]='?' byte=-48 \uFFFFFFD0 short=208 \uD0 LATIN_1_SUPPLEMENT
    char[2]='?' byte=-50 \uFFFFFFCE short=206 \uCE LATIN_1_SUPPLEMENT
    char[3]='?' byte=-60 \uFFFFFFC4 short=196 \uC4 LATIN_1_SUPPLEMENT

    Characters length: 4

    Get characters with given encoding : GBK

    char[0]='中' byte=45 \u2D short=20013 \u4E2D CJK_UNIFIED_IDEOGRAPHS
    char[1]='文' byte=-121 \uFFFFFF87 short=25991 \u6587 CJK_UNIFIED_IDEOGRAPHS

    Characters length: 2

    Get characters with given encoding : UTF-8

    char[0]='?' byte=-3 \uFFFFFFFD short=-3 \uFFFFFFFD SPECIALS
    char[1]='?' byte=-3 \uFFFFFFFD short=-3 \uFFFFFFFD SPECIALS
    char[2]='?' byte=-3 \uFFFFFFFD short=-3 \uFFFFFFFD SPECIALS
    char[3]='?' byte=-3 \uFFFFFFFD short=-3 \uFFFFFFFD SPECIALS

    Characters length: 4

    【2】在英文平臺(tái)下,測試的結(jié)果如下:


    System default encoding --- Cp1252
    System default language --- en

    Get characters with default encoding

    char[0]='?' byte=45 \u2D short=20013 \u4E2D CJK_UNIFIED_IDEOGRAPHS
    char[1]='?' byte=-121 \uFFFFFF87 short=25991 \u6587 CJK_UNIFIED_IDEOGRAPHS

    Characters length: 2

    Get characters with given encoding : ISO-8859-1

    char[0]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN
    char[1]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN

    Characters length: 2

    Get characters with given encoding : GBK

    char[0]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN
    char[1]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN

    Characters length: 2

    Get characters with given encoding : UTF-8

    char[0]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN
    char[1]='?' byte=63 \u3F short=63 \u3F BASIC_LATIN

    Characters length: 2

    【結(jié)論】


    和getBytes(encoding)不同,toCharArray()返回的是"自然字符"。但是這個(gè)"自然字符"的數(shù)目和內(nèi)容卻是由原始的編碼方式?jīng)Q定的。來看看里面是如何進(jìn)行字符串的操作的:
     
     String encodedString = new String(content.getBytes(), encoding);
     char[] charArray = inStr.toCharArray();

    可以看到系統(tǒng)首先對原始字符串按照默認(rèn)的編碼方式進(jìn)行編碼,得到一個(gè)字節(jié)數(shù)組,然后按照指定的新的編碼方式進(jìn)行解碼,得到新的編碼后的字符串。再轉(zhuǎn)換成對應(yīng)的字符數(shù)組。

    由于在中文平臺(tái)下,默認(rèn)的字符集編碼是GBK,于是content.getBytes()得到的是什么呢?就是下面這4個(gè)字節(jié):

     byte[0] = -42 hex string = ffffffd6
     byte[1] = -48 hex string = ffffffd0
     byte[2] = -50 hex string = ffffffce
     byte[3] = -60 hex string = ffffffc4

    如果新的encoding是GBK,那么經(jīng)過解碼后,由于一個(gè)字符用2個(gè)字節(jié)表示。于是最終的結(jié)果就是:
     char[0]='中' --- byte[0] + byte[1]
     char[1]='文' --- byte[2] + byte[3]

    如果新的encoding是ISO-8859-1,那么經(jīng)過解碼后,由于一個(gè)字符用1個(gè)字節(jié)表示,于是原來本應(yīng)該2個(gè)字節(jié)一起解析的變成單個(gè)字節(jié)解析,每個(gè)字節(jié)都代表了一個(gè)漢字字符的一半。這一半的字節(jié)在ISO-8859-1中找不到對應(yīng)的字符,就變成了"?"了,最終的結(jié)果:
     char[0]='?' ---- byte[0]
     char[1]='?' ---- byte[1]
     char[2]='?' ---- byte[2]
     char[3]='?' ---- byte[3]

    如果新的encoding是UTF-8,那么經(jīng)過解碼后,由于一個(gè)字符用3個(gè)字節(jié)表示,于是原來4個(gè)字節(jié)的數(shù)據(jù)無法正常的解析成UTF-8的數(shù)據(jù),最終的結(jié)果也是每一個(gè)都變成"?"。
     char[0]='?' ---- byte[0]
     char[1]='?' ---- byte[1]
     char[2]='?' ---- byte[2]
     char[3]='?' ---- byte[3]

    如果是在英文平臺(tái)下,由于默認(rèn)的編碼方式是Cp1252,于是content.getBytes()得到的字節(jié)都是被截去一半的殘留字符,所以我們看到在英文平臺(tái)下,不論指定的encoding是GBK、UTF-8,其結(jié)果和ISO-8859-1都是一樣的。

    記住:

    這個(gè)方法再次證明了String的getBytes()方法的危險(xiǎn)性,如果我們使用new String(str.getBytes(), encoding)對字符串進(jìn)行重新編碼解碼時(shí),我們一定要清楚str.getBytes()方法返回的字節(jié)數(shù)組的長度、內(nèi)容到底是什么,因?yàn)樵诮酉聛硎褂眯碌膃ncoding進(jìn)行編碼解碼時(shí),Java并不會(huì)自動(dòng)地對字節(jié)數(shù)組進(jìn)行擴(kuò)展以適應(yīng)新的encoding。而是按照新的編碼方法直接對該字節(jié)數(shù)組進(jìn)行解析。

    于是結(jié)果就像上面的例子一樣,同樣是4個(gè)原始字節(jié),有些每2個(gè)一組進(jìn)行解析,有些每個(gè)一組進(jìn)行解析,有些每3個(gè)一組進(jìn)行解析。其結(jié)果就只能看那種編碼方式合適了。



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2010-02-22 17:18 Paul Lin 閱讀(7101) 評論(2)  編輯  收藏 所屬分類: J2SE


    FeedBack:
    # re: 【Java基礎(chǔ)專題】編碼與亂碼(03)----String的toCharArray()方法[未登錄]
    2010-02-27 13:21 | 劉俊杰
    看了你的文章,受益非淺,希望加入我的QQ群48419050,共同進(jìn)步  回復(fù)  更多評論
      
    # re: 【Java基礎(chǔ)專題】編碼與亂碼(03)----String的toCharArray()方法
    2015-06-29 11:33 | thx
    多謝分享  回復(fù)  更多評論
      
    <2015年6月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點(diǎn)博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级**爱片免费视频| 中国亚洲呦女专区| 99精品免费视频| 亚洲精品乱码久久久久久蜜桃不卡 | 国产乱子伦精品免费女| 亚洲成AV人片高潮喷水| 国产精品免费小视频| 精品久久久久久亚洲中文字幕| 日本免费中文字幕在线看| 国产亚洲综合视频| 免费一级毛片免费播放| 美女被爆羞羞网站在免费观看| 亚洲成av人在片观看| 一个人看www免费高清字幕| 亚洲综合日韩久久成人AV| 亚洲免费观看视频| 亚洲人成人77777网站不卡| 24小时免费直播在线观看| 激情婷婷成人亚洲综合| 国产乱辈通伦影片在线播放亚洲 | 亚洲中文字幕在线第六区| 全免费a级毛片免费看| 亚洲人成免费电影| 四虎影院永久免费观看| 精品一区二区三区免费视频| 亚洲中文字幕在线第六区| 免费看片在线观看| 免费观看四虎精品成人| 亚洲AV一宅男色影视| 好先生在线观看免费播放| 人与动性xxxxx免费| 日韩亚洲AV无码一区二区不卡| 成年人视频在线观看免费| 久久久精品视频免费观看| 亚洲国产成人九九综合| mm1313亚洲精品国产| 91福利视频免费观看| 在线观看亚洲专区| 亚洲综合精品香蕉久久网97| 国产成人精品免费视频大全五级| 久久久久久久99精品免费观看 |