九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

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

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

  2. import java.io.UnsupportedEncodingException;

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

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

  19.         GetBytesTest tester = new GetBytesTest();

  20.         byte[] defaultBytes = tester.getBytesWithDefaultEncoding(content);
  21.         tester.printBytes(defaultBytes);

  22.         byte[] iso8859Bytes = tester.getBytesWithGivenEncoding(content,
  23.                 "ISO-8859-1");
  24.         tester.printBytes(iso8859Bytes);

  25.         byte[] gbkBytes = tester.getBytesWithGivenEncoding(content, "GBK");
  26.         tester.printBytes(gbkBytes);

  27.         byte[] utfBytes = tester.getBytesWithGivenEncoding(content, "UTF-8");
  28.         tester.printBytes(utfBytes);

  29.     }

  30.     /** *//**
  31.     * Gets the bytes with default encoding.
  32.     *
  33.     * @param content the content
  34.     *
  35.     * @return the bytes with default encoding
  36.     */
  37.     public byte[] getBytesWithDefaultEncoding(String content) {
  38.         System.out.println("\nEncode with default encoding\n");
  39.         byte[] bytes = content.getBytes();
  40.         return bytes;
  41.     }

  42.     /** *//**
  43.     * Gets the bytes with given encoding.
  44.     *
  45.     * @param content the content
  46.     * @param encoding the encoding
  47.     *
  48.     * @return the bytes with given encoding
  49.     */
  50.     public byte[] getBytesWithGivenEncoding(String content, String encoding) {
  51.         System.out.println("\nEncode with given encoding : " + encoding + "\n");
  52.         try {
  53.             byte[] bytes = content.getBytes(encoding);
  54.             return bytes;
  55.         } catch (UnsupportedEncodingException e) {
  56.             e.printStackTrace();
  57.             return null;
  58.         }
  59.     }

  60.     /** *//**
  61.     * Prints the bytes.
  62.     *
  63.     * @param bytes the bytes
  64.     */
  65.     public void printBytes(byte[] bytes) {
  66.         for (int i = 0; i < bytes.length; i++) {
  67.             System.out.print(" byte[" + i + "] = " + bytes);
  68.             System.out
  69.                     .println(" hex string = " + Integer.toHexString(bytes));
  70.         }
  71.     }

  72. }
復(fù)制代碼
【1】在中文平臺下,測試結(jié)果如下:
System default encoding --- GBK
System default language --- zh

Encode with default encoding

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

Encode with given encoding : ISO-8859-1

byte[0] = 63 hex string = 3f
byte[1] = 63 hex string = 3f

Encode with given encoding : GBK

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

Encode with given encoding : UTF-8

byte[0] = -28 hex string = ffffffe4
byte[1] = -72 hex string = ffffffb8
byte[2] = -83 hex string = ffffffad
byte[3] = -26 hex string = ffffffe6
byte[4] = -106 hex string = ffffff96
byte[5] = -121 hex string = ffffff87

【2】在英文平臺下,測試結(jié)果如下:
System default encoding --- Cp1252
System default language --- en

Encode with default encoding

byte[0] = 63 hex string = 3f
byte[1] = 63 hex string = 3f

Encode with given encoding : ISO-8859-1

byte[0] = 63 hex string = 3f
byte[1] = 63 hex string = 3f

Encode with given encoding : GBK

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

Encode with given encoding : UTF-8

byte[0] = -28 hex string = ffffffe4
byte[1] = -72 hex string = ffffffb8
byte[2] = -83 hex string = ffffffad
byte[3] = -26 hex string = ffffffe6
byte[4] = -106 hex string = ffffff96
byte[5] = -121 hex string = ffffff87

【結(jié)論】

getBytes()、getBytes(encoding)函數(shù)的作用是使用系統(tǒng)默認(rèn)或者指定的字符集編碼方式,將字符串編碼成字節(jié)數(shù)組。

在中文平臺下,默認(rèn)的字符集編碼是GBK,此時如果使用getBytes()或者getBytes("GBK"),則按照GBK的編碼規(guī)則將每個中文字符用2個byte表示。所以我們看到"中文"最終GBK編碼結(jié)果就是: -42 -48 -50 -60 。-42和-48代表了"中"字,而"-50"和"-60"則代表了"文"字。

在中文平臺下,如果指定的字符集編碼是UTF-8,那么按照UTF-8對中文的編碼規(guī)則:每個中文用3個字節(jié)表示,那么"中文"這兩個字符最終被編碼成:-28 -72 -83、-26 -106 -121兩組。每3個字節(jié)代表一個中文字符。

在中文平臺下,如果指定的字符集編碼是ISO-8859-1,由于此字符集是單字節(jié)編碼,所以使用getBytes("ISO-8859-1") 時,每個字符只取一個字節(jié),每個漢字只取到了一半的字符。另外一半的字節(jié)丟失了。由于這一半的字符在字符集中找不到對應(yīng)的字符,所以默認(rèn)使用編碼63代替,也就是?。

在英文平臺下,默認(rèn)的字符集編碼是Cp1252(類似于ISO-8859-1),如果使用GBK、UTF-8進(jìn)行編碼,得到的字節(jié)數(shù)組依然是正確的 (GBK4個字節(jié),UTF-8是6個字節(jié))。因為在JVM內(nèi)部是以Unicode存儲字符串的,使用getBytes(encoding)會讓JVM進(jìn)行一次Unicode到指定編碼之間的轉(zhuǎn)換。對于GBK,JVM依然會轉(zhuǎn)換成4個字節(jié),對于UTF-8,JVM依然會轉(zhuǎn)換成6個字節(jié)。但是對于ISO- 8859-1,則由于無法轉(zhuǎn)換(2個字節(jié)--->1個字節(jié),截取了一半的字節(jié)),所以轉(zhuǎn)換后的結(jié)果是錯誤的。

相同的平臺下,同一個中文字符,在不同的編碼方式下,得到的是完全不同的字節(jié)數(shù)組。這些字節(jié)數(shù)組有可能是正確的(只要該字符集支持中文),也可能是完全錯誤的(該字符集不支持中文)。

記?。?/strong>

不要輕易地使用或濫用String類的getBytes(encoding)方法,更要盡量避免使用getBytes()方法。因為這個方法是平臺依賴的,在平臺不可預(yù)知的情況下完全可能得到不同的結(jié)果。如果一定要進(jìn)行字節(jié)編碼,則用戶要確保encoding的方法就是當(dāng)初字符串輸入時的 encoding。(文/Paul Lin

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

聯(lián)系客服