Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java从System.com获取日语或中文输入_Java_Input_Internationalization_Stream - Fatal编程技术网

使用Java从System.com获取日语或中文输入

使用Java从System.com获取日语或中文输入,java,input,internationalization,stream,Java,Input,Internationalization,Stream,我正在尝试为我编写的一个小型echo服务器接收日语字符。问题是,当我从System.in(通过任何东西,扫描仪,InputStream,你可以说)获取字符时,它们总是以垃圾的形式出现。我甚至试着用 message = new String(bufferedReader.readLine().getBytes("UTF8"); 以尝试获取作为Unicode输入的字节 当我从服务器打印消息时ようこそ (欢迎使用日语)它很好,问题只存在于接受用户输入时 控制台设置为在eclipse中使用UTF8

我正在尝试为我编写的一个小型echo服务器接收日语字符。问题是,当我从System.in(通过任何东西,扫描仪,
InputStream
,你可以说)获取字符时,它们总是以垃圾的形式出现。我甚至试着用

message = new String(bufferedReader.readLine().getBytes("UTF8");  
以尝试获取作为Unicode输入的字节

当我从服务器打印消息时ようこそ (欢迎使用日语)它很好,问题只存在于接受用户输入时

控制台设置为在eclipse中使用UTF8

下面是我编写的一个小测试程序,以确保它是System.in的输入

输入和输出是

よ
よ
这是代码

public class TestUnicode {

public static void main(String[] args) throws IOException
{
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in, "UTF8"));
    String message = stdIn.readLine();
    System.out.println(message);
}
}


创建InputStreamReader时,应指定要使用的字符集:

new InputStreamReader(System.in, "UTF-8")
这也适用于套接字流

如果不这样做,则将使用默认字符集(编码)。您还可以通过添加
-Dfile.encoding=UTF-8
作为VM参数来更改默认值

关于您的测试程序,System.out.println还使用默认字符集,因此即使正确读取了字符串,它也会弄乱字符串。因此,除非更改默认字符集,否则可以使用类似以下内容打印字符串:

final OutputStreamWriter w = new OutputStreamWriter(System.out, "UTF-8");
w.write(message);
w.flush();

我这样修改了你的课程

public class TestUnicode {

    /**
     * @param args
     */
    public static void main(String[] args) {
        BufferedReader stdIn = null;
        try {
            stdIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        String message = "";
        try {
            message = stdIn.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(new String(message.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
并在控制台中运行它,得到所需的输出

因此,在您的情况下,我建议您将字符编码部分放在BufferedReader和PrintStream中

注意:我尝试使用IDE运行它,并输出“?”对于那个日文字符,我建议在控制台中运行它


我猜您正在使用Windows。
这里的问题是,DOS提示符使用的字符编码与UTF-8完全不同。如果是日语,它将是Shift JIS,因此尝试用UTF-8
InputStream
读出它将不起作用

幸运的是,还有希望。您可以(也应该)使用
System.console()
,而不是使用
System.in
。它将返回具有有效字符编码转换的实例。然而,您必须意识到,尝试在IDE(特别是Eclipse)之外调试它是行不通的,因为它不连接控制台。哎呀

更正后的代码(我肯定可以工作,但我还没有测试):


请注意,您还需要使用
控制台
打印消息。为什么?这仅仅是因为您需要双向转换字符编码。DOS提示符仍然保留在传统的编码中,没有办法改变它。

这不起作用,我以前试过,现在刚开始,我甚至在发送到服务器之前就收到垃圾,它读入垃圾,然后发送垃圾,然后回显。你能写一个简单的测试程序,只读取一个字符串并打印出来吗?因为问题不在于套接字。问题是,如果我查看调试器,它发生在消息读入时,而不是打印时,因此您可能是对的,但问题甚至在之前就发生了。另外,根据您的建议,我的默认字符集现在是UTF-8。我获得与您粘贴的输出类似的内容的唯一方法是:获取输入字符串,使用UTF-8将其转换为字节,使用ISO-8859-1将其转换回字符串,然后将其打印为UTF-8。但我无法使用您提供的代码实现这一点。我不确定你这方面发生了什么…也试着按照@gyan的建议从命令行运行这个程序。你能从shell/命令窗口运行这个程序并查看输出吗。请确保您的命令窗口已设置为UTF-8模式(按字体)。这是否会生成?在eclipse的控制台中,但如果我将eclipse的显示编码更改为Unicode,它将无法正确显示,よ 变成ˆˆ,我在windows中,但如果需要,我可以启动Ubuntu,看看它是否在那里工作。我只需要确保我可以获得UTF8输入,这样当我正在使用的这个应用程序有一个GUI时,它就可以工作了…尝试使用console.writer()返回一个空指针异常,可能是因为我在eclipse中运行,而不是在终端中运行。Windows控制台不支持unicode,但我可以试试cygwinnow@Brandon:是的,Eclipse中没有
console.writer()
。唯一的方法是从终端运行应用程序。即使您想使用Cygwin,我也建议您使用
控制台
而不是
System.in
/
System.out
public class TestUnicode {

    /**
     * @param args
     */
    public static void main(String[] args) {
        BufferedReader stdIn = null;
        try {
            stdIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        String message = "";
        try {
            message = stdIn.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(new String(message.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
public class TestUnicode {

public static void main(String[] args) throws IOException
{
Console console = System.console();
String message = console.readLine();
console.writer().println(message);
}