无法通过system.in读取日语字符

qltillow  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(321)

代码:

Scanner sc = new Scanner(System.in);
System.out.println("Enter Name : ");
String name = sc.nextLine();
System.out.println(name);

String encoding = "UTF-8";
System.out.println(new String(name.getBytes(encoding), "euc-jp"));
System.out.println(new String(name.getBytes(encoding), "Shift_JIS"));
System.out.println(new String(name.getBytes(encoding), "ISO-2022-JP"));
System.out.println(new String(name.getBytes(encoding), "ISO8859-1"));

输入:
输入名称:たなかです
输出:
�f�q���n�@
鐃�鐃�鐃緒申鐃�鐃�
�ソスf�ソスq�ソス�ソス�ソスn�ソス@
���f���q���������n���@
�f�q���n�@
没有一本是可读的日语。我也试过了 InputStreamReader 以及 DataInputStreamByte[] .

6za6bjd0

6za6bjd01#

如何用代码正确地打印字符串到控制台 name.getBytes(encoding) 在您的代码中,将获得 String name 使用utf-8编码。所以当你打字的时候たなかです" 在控制台中,您将获得字节数组 {0xE3, 0x81, 0x9F, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA7, 0xE3, 0x81, 0x99} .

它是基于utf-8的表示,因此您只能在构造函数的第二个参数中指定编码 String(byte[] bytes, String charsetName)UTF-8 .

System.out.println(new String(name.getBytes(encoding), "UTF-8"));

它转换字节数组 {0xE3, 0x81, 0x9F, ... }String 对象,并正确打印到控制台。

如何将字符串的内部表示形式设置为字节数组 String 对象使用utf-16作为内部文本表示(请参见https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html 详细信息)。

所以你必须使用 name.getBytes("UTF-16") 当您想要获得与内部文本表示相同的字节数组时。你可以把它倒过来 String 对象 System.out.println(new String(name.getBytes("UTF-16"), "UTF-16")); .

mitkmikd

mitkmikd2#

下面的代码片段中有一个小问题,您对不同的字符集使用相同的编码,

String encoding = System.getProperty("file.encoding"); 
System.out.println(new String(name.getBytes(encoding), "UTF-8"));

假设要使用不同的字符集打印日语字符,请使用

System.out.println(new String(name.getBytes("euc-jp"), "euc-jp"));
 System.out.println(new String(name.getBytes("Shift_JIS"), "Shift_JIS"));
 System.out.println(new String(name.getBytes("ISO-2022-JP"), "ISO-2022-JP"));
 System.out.println(new String(name.getBytes("ISO8859-1"), "ISO8859-1"));

相关问题