Java使用扫描仪以UTF8格式输入字符,无法打印文本
我可以将字符串转换为UTF-8格式的数组,但不能像第一个字符串那样将其转换回字符串
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
打印为字符串
# 1 楼答案
提供的代码存在几个问题:
您无法确保从该字符串获取UTF-8字节数组
返回给定平台上具有默认编码的字节数组,如JavaDoc所述。您实际想要做的是:
您应该检查documentation中的
System.out.println()
:正在调用
System.out.println(Object x)
,它将打印x.toString()
的结果。默认情况下,toString()返回给定对象的内存地址因此,当您看到表单的输出时:
您看到的是ByteArray的内存位置,然后是给定的文本输入行
您似乎不理解“x.toString()”方法。记住,Java中的字符串是immutable;String的任何方法都不会更改字符串
theByteArray.toString();
返回theByteArray;
的字符串表示形式。除非将返回的值赋给另一个字符串,否则将抛出该值但是,如前所述,返回的字符串将是
theByteArray
的内存位置。为了打印出theByteArray
的内容,需要将其转换为字符串假设您的要求是打印转换后的字符串,然后打印原始字符串,那么您的代码应该如下所示:
# 2 楼答案
应该是
这里的根本问题是字符串构造函数不聪明。字符串构造函数无法区分正在使用的字符集,将尝试使用系统标准(通常类似于ASCII或ISO-8859-1)对其进行转换。这就是为什么正常的A-Za-z看起来很合适,但其他一切都开始失败的原因
byte是一种从-127到127的类型,因此对于UTF-8转换,需要连接连续的字节。字符串构造函数不可能将其与字节数组区分开来,因此默认情况下它将单独处理每个字节(因此,当基本字母数字落入此范围时,它们将始终工作)
例如: