2012-12-14 39 views
8

我正努力让Eclipse正确读取中文字符,并且我不确定哪里可能出错。Java控制台不能正确读取中文字符

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

我已将它缩减为以下测试示例,并明确说明了它与我在每个阶段发生的事情 - 请注意,我是一名学生,非常想确认我的理解(或其他方式):)

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: 之謂甚; 

> 

什么是看到这个堆栈溢出后完全匹配什么我在Eclipse控制台中看到什么Eclipse调试器内看到(观看时/编辑变量值) 。通过Eclipse调试器手动更改变量值会导致代码取决于该值的行为,因为我通常会期望它们的行为,这表明它是如何读取文本IN这是一个问题。

我已经尝试了很多不同的扫描仪/缓冲流[reader | writer]等的组合来读入和输出,有和没有明确的字符类型,虽然这不是特别系统地完成,并且很容易遗漏某些东西。

我试图设置Eclipse环境尽可能使用UTF-8,但我想我可能错过了一两个地方。请注意,控制台将正确输出硬编码的中文字符。

在这个问题上的任何援助/指导,非常感谢:)

+0

System.out是['PrintStream'](http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html),它逐字节地工作。您需要将其封装在['PrintWriter'](http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html)或['OutputStreamWriter'](http:///docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html)将其输出为字符,这就是为什么userInput输出不正确的原因。 – Powerlord

+0

我担心我可能在这里很朴素,我即将编辑这个问题 - 请协助我了解您认为使用输出编写器输出值(此时以String存储)的帮助信息。 – kwah

+0

还有什么想法添加到此?也许我应该在Eclipse上问一下,看看它是否是IDE问题..? – kwah

回答

2

它看起来像控制台没有正确读取输入。这里有一个我相信描述你的问题和工作的链接。

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

简单的答案: 尝试设置环境变量-Dfile.encoding = UTF-8在你的eclipse.ini。 (启用此对于整个月食之前,你可以只尝试在调试configurtion对这一计划的设置,看看是否它的工作原理)

的链接有很多建议

+0

@kwah你试过这个建议吗? – Zenil

+1

我可以确认在'eclipse.ini'中添加'-Dfile.encoding = UTF-8'的初始测试似乎可行! :)我将在一两天内将其标记为正确的答案,以便我有机会比初始测试更彻底地进行测试。 – kwah

+0

你知道为什么Eclipse需要一个环境变量来识别非Unicode输入吗? – kwah

1

试试这个: 在Eclipse中,右键点击你的主类,然后单击运行方式>运行配置。然后转到常用选项卡并将编码更改为UTF-8。这应该工作!

+0

似乎没有帮助 - 它已经是UTF-8 – kwah

0

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

您应该四处搜索并了解如何让IDE能够正确编译非ASCII字符。在python中,这是在代码本身完成的,我不确定它是如何在Java中完成的。

相关问题