Java控制台无法正确读取中文字符

8

我在努力让Eclipse正确读取中文字符,但我不确定哪里出了问题。

具体地说,在从控制台读取简体或繁体中文字符串以及输出它之间的某个地方,它变成了乱码。即使输出一个大量混合文本(英文/中文字符)的字符串,它似乎也只会改变中文字符的外观。

我把它缩减到以下测试示例,并明确注释了每个阶段我认为发生的情况 - 请注意,我是一名学生,非常希望确认自己的理解是否正确 :)

public static void main(String[] args) {    
    try 
    {
        boolean isRunning = true;

        //Raw flow of input data from the console
        InputStream inputStream = System.in;
        //Allows you to read the stream, using either the default character encoding, else the specified encoding;
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
        //Adds functionality for converting the stream being read in, into Strings(?)
        BufferedReader input_BufferedReader = new BufferedReader(inputStreamReader);


        //Raw flow of outputdata to the console
        OutputStream outputStream = System.out;
        //Write a stream, from a given bit of text
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
        //Adds functionality to the base ability to write to a stream
        BufferedWriter output_BufferedWriter = new BufferedWriter(outputStreamWriter);



        while(isRunning) {
            System.out.println();//force extra newline
            System.out.print("> ");

            //To read in a line of text (as a String):
            String userInput_asString = input_BufferedReader.readLine();

            //To output a line of text:
            String outputToUser_fromString_englishFromCode = "foo"; //outputs correctly
            output_BufferedWriter.write(outputToUser_fromString_englishFromCode);
            output_BufferedWriter.flush();

            System.out.println();//force extra newline

            String outputToUser_fromString_ChineseFromCode = "之謂甚"; //outputs correctly
            output_BufferedWriter.write(outputToUser_fromString_ChineseFromCode);
            output_BufferedWriter.flush();

            System.out.println();//force extra newline

            String outputToUser_fromString_userSupplied = userInput_asString; //outputs correctly when given English text, garbled when given Chinese text
            output_BufferedWriter.write(outputToUser_fromString_userSupplied);
            output_BufferedWriter.flush();

            System.out.println();//force extra newline

        }
    }
    catch (Exception e) {
        // TODO: handle exception
    }
}

样例输出:

> 之謂甚
foo
之謂甚
之謂甚

> oaea
foo
之謂甚
oaea

> mixed input - English: fubar; Chinese: 之謂甚;
foo
之謂甚
mixed input - English: fubar; Chinese: 之謂甚;

> 

在这个Stack Overflow帖子中看到的内容与我在Eclipse控制台和查看/编辑变量值时看到的内容完全一致。通过Eclipse调试器手动更改变量值会导致依赖该值的代码表现出我通常期望的行为,这表明是如何读取文本中的问题
我尝试使用许多不同的扫描仪/缓冲流[reader | writer]等以进行读入和输出,包括显式字符类型和未显式字符类型,但这并没有特别系统地完成,可能很容易错过某些事情。
我已经尝试将Eclipse环境设置为在可能的任何地方都使用UTF-8,但我想我可能错过了一两个地方。请注意,控制台将正确输出硬编码的汉字。
十分感谢您的任何协助/指导! :)

System.out是一个PrintStream,它按字节工作。您需要将其包装在PrintWriterOutputStreamWriter中以字符形式输出,这就是为什么userInput输出不正确的原因。 - Powerlord
我担心我可能有些天真了,我即将编辑这个问题-请帮助我理解您认为在输出写入器中输出一个值(此时作为字符串存储)会有所帮助的地方。 - kwah
还有什么想法要补充吗?也许我应该去 Eclipse 上问一下,看看这是否是一个 IDE 问题..? - kwah
3个回答

2
看起来控制台没有正确读取输入。这是一个链接,我相信描述了您的问题和解决方法。

http://paranoid-engineering.blogspot.com/2008/05/getting-unicode-output-in-eclipse.html

简单回答: 尝试在您的eclipse.ini中设置环境变量-Dfile.encoding=UTF-8。 (在为整个eclipse启用此功能之前,您可以尝试仅在此程序的调试配置中设置此项,看看是否有效)
链接中还有更多建议。

@kwah 你试过这个建议了吗? - Zenil
1
我可以确认,在 eclipse.ini 文件中添加 -Dfile.encoding=UTF-8 进行的初步测试似乎有效! :) 我会在一两天内将其标记为正确答案,届时我将对此进行更全面的测试。 - kwah
你有没有想过为什么Eclipse需要一个环境变量才能识别非Unicode输入? - kwah
这与控制台使用的平台的默认编码有关。您可以使用file.encoding属性设置来覆盖默认编码。上面链接中的这个Eclipse bug似乎与此相关https://bugs.eclipse.org/bugs/show_bug.cgi?id=13865 - Zenil
-Dfile.encoding=UTF-8 在 Eclipse 中可行,但在服务器的构建产物上无效。 - Yogesh Bombe
显示剩余2条评论

1
尝试这个: 在Eclipse中,右键单击您的主类,然后单击运行为>运行配置。然后转到常规选项卡并将编码更改为UTF-8。那应该可以了!

0

这似乎是一个编码问题。可能有两个问题: 1. 你没有激活编译器读取除ASCII字符以外的任何内容的能力,在你的情况下,你需要能够读取UTF-8字符。 2. 你可能已经删除了某些语言包?这不太可能,因为你可能能够写中文字符?

你应该搜索并学习如何使你的IDE正确编译非ASCII字符。在Python中,这是在代码本身中完成的,我不确定在Java中如何完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接