簡體   English   中英

Java,使用Scanner將字符輸入為UTF-8,無法打印文本

[英]Java, Using Scanner to input characters as UTF-8, can't print text

我可以將String轉換為Array作為UTF-8,但是我不能像第一個String那樣將它轉換回String。

public static void main(String[] args) {

    Scanner h = new Scanner(System.in);
    System.out.println("INPUT : ");
    String stringToConvert = h.nextLine();
    byte[] theByteArray = stringToConvert.getBytes();

    System.out.println(theByteArray);
    theByteArray.toString();
    String s = new String(theByteArray);

    System.out.println(""+s);
}

如何將theByteArray打印為字符串?

String s = new String(theByteArray);

應該真的

String s = new String(theByteArray, Charset.forName("UTF-8"));

這里的根本問題是String構造函數不聰明。 String構造函數無法區分正在使用的字符集,並嘗試使用系統標准(通常類似於ASCII或ISO-8859-1)對其進行轉換。 這就是為什么普通的A-Za-z看起來很合適,但其他一切都開始失敗了。

byte是從-127到127的類型,因此對於UTF-8轉換,連續的字節需要連接。 String構造函數不可能將其與字節數組區分開來,因此默認情況下它將單獨處理每個字節(因此,為什么基本的字母數字將始終工作,因為它們屬於此范圍)。

例:

String text = "こんにちは";
byte[] array = text.getBytes("UTF-8");
String s = new String(array, Charset.forName("UTF-8"));
System.out.println(s); // Prints as expected
String sISO = new String(array, Charset.forName("ISO-8859-1")); // Prints 'ããã«ã¡ã¯'
System.out.println(sISO);

提供的代碼有幾個問題:

  1. 您無法確保從該String獲取UTF-8字節數組。

     byte[] theByteArray = stringToConvert.getBytes(); 

    返回給定平台上具有默認編碼的字節數組,如JavaDoc所述 你真正想做的是以下幾點:

     byte[] theByteArray = stringToConvert.getBytes("UTF-8"); 
  2. 您應該檢查System.out.println()文檔

     System.out.println(theByteArray); 

    正在調用System.out.println(Object x) ,它將打印x.toString()的結果。 默認情況下,toString()返回給定對象的內存地址。

    所以當你看到表單的輸出時:

    輸入:

    [B @ 5f1121f6

    輸入文本

    你看到的是theByteArray的內存位置,然后是給定的文本輸入行。

  3. 你似乎不理解'x.toString()'方法。 請記住,Java中的字符串是不可變的 ; String的所有方法都不會改變String。 theByteArray.toString(); 返回 theByteArray;的字符串表示theByteArray; 除非您將值賦給另一個String,否則拋出返回的值

     String arrayAsString = theByteArray.toString(); 

    但是,如前所述,返回的String將是theByteArray的內存位置。 為了打印出theByteArray的內容,您需要將其轉換為String

     String convertedString = new String(theByteArray, Charset.forName("UTF-8")); 

假設您的要求是打印轉換后的String然后打印原始String,您的代碼應如下所示:

public static void main(String[] args) {

    Scanner h = new Scanner(System.in);
    System.out.println("INPUT : ");
    String stringToConvert = h.nextLine();

    try {
        // Array of the UTF-8 representation of the given String
        byte[] theByteArray;
        theByteArray = stringToConvert.getBytes("UTF-8");

        // The converted String
        System.out.println(new String(theByteArray, Charset.forName("UTF-8")));
    } catch (UnsupportedEncodingException e) {
        // We may provide an invalid character set
        e.printStackTrace();
    }

    // The original String
    System.out.println(stringToConvert);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM