国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【Java 基礎專題】編碼與亂碼(03)----String的toCharArray()方...
【Java 基礎專題】編碼與亂碼(03)----String的toCharArray()方法測試
cobra - 2010-2-22 23:54:00
上一篇:【Java 基礎專題】編碼與亂碼(02)---String的getBytes([encoding])方法測試
  1. package example.encoding;

  2. import java.io.UnsupportedEncodingException;

  3. /** *//**
  4. * The Class GetCharTest.
  5. */
  6. public class GetCharTest {

  7.     /** *//**
  8.     * The main method.
  9.     *
  10.     * @param args the arguments
  11.     */
  12.     public static void main(String args[]) {
  13.         String content = "中文";
  14.         String defaultEncoding = System.getProperty("file.encoding");
  15.         String defaultLnaguage = System.getProperty("user.language");
  16.         System.out.println("System default encoding --- " + defaultEncoding);
  17.         System.out.println("System default language --- " + defaultLnaguage);

  18.         GetCharTest tester = new GetCharTest();
  19.         tester.getCharWithDefaultEncoding(content);
  20.         tester.getCharWithGivenEncoding(content, "ISO-8859-1");
  21.         tester.getCharWithGivenEncoding(content, "GBK");
  22.         tester.getCharWithGivenEncoding(content, "UTF-8");
  23.     }

  24.     /** *//**
  25.     * Gets the char with default encoding.
  26.     *
  27.     * @param content the content
  28.     *
  29.     * @return the char with default encoding
  30.     */
  31.     public void getCharWithDefaultEncoding(String content) {
  32.         System.out.println("\nGet characters with default encoding\n");
  33.         printCharArray(content);
  34.     }

  35.     /** *//**
  36.     * Gets the char with given encoding.
  37.     *
  38.     * @param content the content
  39.     * @param encoding the encoding
  40.     *
  41.     * @return the char with given encoding
  42.     */
  43.     public void getCharWithGivenEncoding(String content, String encoding) {
  44.         System.out.println("\nGet characters with given encoding : " + encoding
  45.                 + "\n");
  46.         try {
  47.             String encodedString = new String(content.getBytes(), encoding);
  48.             printCharArray(encodedString);
  49.         } catch (UnsupportedEncodingException e) {
  50.             e.printStackTrace();
  51.         }
  52.     }

  53.     /** *//**
  54.     * Prints the char array.
  55.     *
  56.     * @param inStr the in str
  57.     */
  58.     public void printCharArray(String inStr) {
  59.         char[] charArray = inStr.toCharArray();

  60.         for (int i = 0; i < inStr.length(); i++) {
  61.             byte b = (byte) charArray;
  62.             short s = (short) charArray;
  63.             String hexB = Integer.toHexString(b).toUpperCase();
  64.             String hexS = Integer.toHexString(s).toUpperCase();
  65.             StringBuffer sb = new StringBuffer();

  66.             // print char
  67.             sb.append("char[");
  68.             sb.append(i);
  69.             sb.append("]='");
  70.             sb.append(charArray);
  71.             sb.append("'\t");

  72.             // byte value
  73.             sb.append("byte=");
  74.             sb.append(b);
  75.             sb.append(" \\u");
  76.             sb.append(hexB);
  77.             sb.append('\t');

  78.             // short value
  79.             sb.append("short=");
  80.             sb.append(s);
  81.             sb.append(" \\u");
  82.             sb.append(hexS);
  83.             sb.append('\t');

  84.             // Unicode Block
  85.             sb.append(Character.UnicodeBlock.of(charArray));

  86.             System.out.println(sb.toString());
  87.         }
  88.         System.out.println("\nCharacters length: " + charArray.length);
  89.     }

  90. }
復制代碼
【1】在中文平臺下,測試的結(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】在英文平臺下,測試的結(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(ncoding)不同,toCharArray()返回的是"自然字符"。但是這個"自然字符"的數(shù)目和內(nèi)容卻是由原始的編碼方式?jīng)Q定的。來看看里面是如何進行字符串的操作的:
  1. String encodedString = new String(content.getBytes(), encoding);
  2. char[] charArray = inStr.toCharArray();
復制代碼
可以看到系統(tǒng)首先對原始字符串按照默認的編碼方式進行編碼,得到一個字節(jié)數(shù)組,然后按照指定的新的編碼方式進行解碼,得到新的編碼后的字符串。再轉(zhuǎn)換成對應的字符數(shù)組。

由于在中文平臺下,默認的字符集編碼是GBK,于是content.getBytes()得到的是什么呢?就是下面這4個字節(jié):
  1. byte[0] = -42 hex string = ffffffd6
  2. byte[1] = -48 hex string = ffffffd0
  3. byte[2] = -50 hex string = ffffffce
  4. byte[3] = -60 hex string = ffffffc4
復制代碼
如果新的encoding是GBK,那么經(jīng)過解碼后,由于一個字符用2個字節(jié)表示。于是最終的結(jié)果就是:
  1. char[0]='中' --- byte[0] + byte[1]
  2. char[1]='文' --- byte[2] + byte[3]
復制代碼
如果新的encoding是ISO-8859-1,那么經(jīng)過解碼后,由于一個字符用1個字節(jié)表示,于是原來本應該2個字節(jié)一起解析的變成單個字節(jié)解析,每個字節(jié)都代表了一個漢字字符的一半。這一半的字節(jié)在ISO-8859-1中找不到對應的字符,就變成了"?"了,最終的結(jié)果:
  1. char[0]='?' ---- byte[0]
  2. char[1]='?' ---- byte[1]
  3. char[2]='?' ---- byte[2]
  4. char[3]='?' ---- byte[3]
復制代碼
如果新的encoding是UTF-8,那么經(jīng)過解碼后,由于一個字符用3個字節(jié)表示,于是原來4個字節(jié)的數(shù)據(jù)無法正常的解析成UTF-8的數(shù)據(jù),最終的結(jié)果也是每一個都變成"?"。
  1. char[0]='?' ---- byte[0]
  2. char[1]='?' ---- byte[1]
  3. char[2]='?' ---- byte[2]
  4. char[3]='?' ---- byte[3]
復制代碼
如果是在英文平臺下,由于默認的編碼方式是Cp1252,于是content.getBytes()得到的字節(jié)都是被截去一半的殘留字符,所以我們看到在英文平臺下,不論指定的encoding是GBK、UTF-8,其結(jié)果和ISO-8859-1都是一樣的。

記?。?/strong>

這個方法再次證明了String的getBytes()方法的危險性,如果我們使用new String(str.getBytes(), encoding)對字符串進行重新編碼解碼時,我們一定要清楚str.getBytes()方法返回的字節(jié)數(shù)組的長度、內(nèi)容到底是什么,因為在接下來使用新的encoding進行編碼解碼時,Java并不會自動地對字節(jié)數(shù)組進行擴展以適應新的encoding。而是按照新的編碼方法直接對該字節(jié)數(shù)組進行解析。

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

下一篇:【Java 基礎專題】編碼與亂碼(04)---輸出時的編碼與亂碼
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服