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)
当我在 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)