繁体   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