Java: 为什么 Chinese/Japanese 个字符显示为 '???'当我将数据附加到文本文件时,而 运行 独立于 Netbeans 的 .jar?

Java: Why are Chinese/Japanese characters displaying as '???' when I append data to a text file, whilst running the .jar independant of Netbeans?

当我在 Netbeans 中 运行 安装程序时,让这些字符(例如戦う)正确显示没有问题。早些时候,我在netbeans.conf文件中添加了参数-J-Dfile.encoding=UTF-8。

本质上,我正在创建一个程序来将数据附加到文本文件的末尾。通过 Netbeans 运行ning 时,数据将被正确保存,并且当我打开文件时字符将显示出来。但是,当我 运行 独立于 Netbeans 的 .jar(或 运行 一个内置的 .exe)时,它只是将字符保存到文件中作为 '????'。

下面的代码显示了将数据附加到文件的方法。 boxValue[] 存储我附加的字符串数据。当 运行 通过 Netbeans 连接程序时,当我打开文件时,文件输出将如下所示:

食べる 吃 - 平原:礼物 たべる 5 食べる

运行 该程序在没有 Netbeans 的情况下会在文本文件中独立生成:

???吃 - 普通:礼物??? 5 ???

private void prepareFile(String[] boxValue, boolean ruVerbIN, String addressIN){

 try
 {     
     int counter = 0; 
     int counter2;

     if(ruVerbIN == false)
     {
         counter2 = 63;
     }
     else
     {
         counter2 = 55;
     }

    File wordFile = new File(addressIN);
    FileWriter fileWriter = new FileWriter(wordFile, true);
    BufferedWriter buffer = new BufferedWriter(fileWriter);
    PrintWriter printWriter = new PrintWriter(buffer);

    while(counter <= counter2)
    {     
        printWriter.println(boxValue[counter]);        
        counter++;       
    }
    printWriter.close();
    counter = 0;
    outputTextBox.setText("Export successful.");
 }
 catch(IOException e)
 {     
     outputTextBox.setText("There was an error. Are you sure you entered the directory correctly? For example:" + "\n\n" + "\"C:\\Users\\Jayden\\Documents\\FLTR\\FLTR Data\\Japanese_Words.csv\"");
 }

}

FileWriter 的文档:

Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.

所以使用的编码取决于运行环境。

始终明确提供编码:

try(OutputStream out = new FileOutputStream(file);
    Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8) {
  // I/O
} catch (IOException e) {
  // error handling
}

您是否尝试过在您的程序中再次读取该文件?在 windows 机器上,默认编码是 CP-1252 而不是 UTF-8。

您还可以使用具有给定字符集的 BufferedWriter

FileWriter fw = new FileWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));

或与Java7

    Charset charset = Charset.forName("UTF-8");
    BufferedWriter writer = Files.newBufferedWriter(p.resolve("foo.txt"), charset)