[英]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);
提供的代碼有幾個問題:
您無法確保從該String獲取UTF-8字節數組。
byte[] theByteArray = stringToConvert.getBytes();
返回給定平台上具有默認編碼的字節數組,如JavaDoc所述 。 你真正想做的是以下幾點:
byte[] theByteArray = stringToConvert.getBytes("UTF-8");
您應該檢查System.out.println()
的文檔 :
System.out.println(theByteArray);
正在調用System.out.println(Object x)
,它將打印x.toString()
的結果。 默認情況下,toString()返回給定對象的內存地址。
所以當你看到表單的輸出時:
輸入:
[B @ 5f1121f6
輸入文本
你看到的是theByteArray的內存位置,然后是給定的文本輸入行。
你似乎不理解'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.