Java,使用扫描器以UTF-8的形式输入字符,可以';不打印文本
我可以将字符串转换为UTF-8格式的数组,但不能像第一个字符串那样将其转换回字符串Java,使用扫描器以UTF-8的形式输入字符,可以';不打印文本,java,Java,我可以将字符串转换为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.getBy
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);
}
如何将ByteArray作为字符串打印?提供的代码有几个问题:
byte[] theByteArray = stringToConvert.getBytes();
返回给定平台上具有默认编码的字节数组,如所述。您实际想要做的是:
byte[] theByteArray = stringToConvert.getBytes("UTF-8");
系统.out.println()
:
正在调用System.out.println(对象x)
,它将打印x.toString()的结果。默认情况下,toString()返回给定对象的内存地址
因此,当您看到表单的输出时:
输入:
[B@5f1121f6
输入文本
您看到的是ByteArray的内存位置,然后是给定的文本输入行
theByteArray.toString();
返回theByteArray;
的字符串表示形式。除非您将值赋给另一个字符串,否则将抛出返回的值
String arrayAsString = theByteArray.toString();
但是,如前所述,返回的字符串将是theByteArray
的内存位置。要打印theByteArray
的内容,需要将其转换为字符串
String convertedString = new String(theByteArray, Charset.forName("UTF-8"));
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);
}
应该是
String s = new String(theByteArray, Charset.forName("UTF-8"));
这里的根本问题是字符串构造函数不聪明。字符串构造函数无法区分正在使用的字符集,并将尝试使用系统标准(通常类似于ASCII或ISO-8859-1)对其进行转换。这就是为什么正常的A-Za-z看起来是正确的,但其他一切都开始失败
byte是一种从-127到127的类型,因此对于UTF-8转换,需要串联连续字节。字符串构造函数无法将其与字节数组区分开来,因此默认情况下它将单独处理每个字节(因此,当基本字母数字落入此范围时,为什么它们始终工作)
例如:
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);
看起来它在我看来工作得很好:提供测试输入/预期输出/实际输出。非常感谢。你说a很容易理解,但这段代码确实有效。例如我的示例输入:Bác(基于越南语言),在转换回字符串后,我只看到平方-。-“你是对的。我用Joe的回答纠正了我的错误。”。
String s = new String(theByteArray, Charset.forName("UTF-8"));
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);