使用正确的字符集在Java中保存txt文件以获取€-签名
我想保存一个java生成的txt文件。我是这样做的:使用正确的字符集在Java中保存txt文件以获取€-签名,java,character-encoding,text-files,symbols,Java,Character Encoding,Text Files,Symbols,我想保存一个java生成的txt文件。我是这样做的: StringBuilder builder = new StringBuilder(); for(int i = 0; i < row; i++){ for(int j = 0; j < col; j++) { builder.append(Satz[i][j]+""); if(j < col - 1) builder.append(";"
StringBuilder builder = new StringBuilder();
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++) {
builder.append(Satz[i][j]+"");
if(j < col - 1)
builder.append(";");
}
builder.append("\n");
}
System.out.println("builder");
System.out.println(builder);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(path));
//writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writer.write(builder.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在txt文件中,如下所示:
von 24,5 mio€ (vorjahr: bereinigt 11,4 mio€)
24,5 mio€ (vorjahr: bereinigt 11,4 mio€)
我做错了什么?有人能帮我解决这个问题吗
谢谢大家! 默认情况下,编写器以
UTF-8
格式存储字符串。当您使用设置为UTF-8
的文本编辑器(如记事本++)打开存储的文本文件时,您应该会看到相同的字符串。请注意,即使在以其他格式查看文本文件时特殊字符看起来是错误的,但文件中的数据仍然正确,应用程序可以读取这些数据以重新获取存储的字符串。从您看到的字符中,最可能的设置是:
Java编辑器和编译器设置为使用一致的编码,可能(但不一定)是UTF-8
运行Java程序时,默认编码似乎是UTF-8。您可以使用System.getProperty(“file.encoding”)
检查它,您会得到一个根据UTF-8规则对其字符进行编码的文件,其中欧元符号产生三个字节E2 82 AC
查看文件时,使用的编辑器采用Windows CP-1252编码(可能是标准的Windows编辑器应用程序NOTEPAD.EXE?)。在CP-1252中,每个字符正好占用一个字节。然后,编辑器将三个字节E2 82 AC
(表示欧元符号)视为三个单个字符,
谁来读这个文件
- 如果它是一个类似于您的Java程序,您可以安全地忽略某些Windows编辑器显示无意义的事实(或者您可以从编辑器中打开文件并指定UTF-8编码,例如在“打开”对话框中)
- 如果是西欧典型机器上的Windows编辑器,它将采用CP1252编码。因此,您应该专门使用该编码编写文件:
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "CP1252"));
无论如何,生成该文件的程序和稍后读取该文件的应用程序应该首先就公共字符编码(CP1252、UTF-8或其他)达成一致。否则,您将看到上面这样的无意义结果。在字节级别,文件中实际是什么,而不是它的外观?后者受显示内容的任何内容的控制-尤其是,它是否知道内容是UTF-8编码的?可能会有许多不同的配置错误导致您描述的问题。因此,有几个问题有助于分析:查看文本文件时使用的工具(记事本/编辑器/任何工具)是什么?Java平台的默认编码是什么(
System.getProperty(“file.encoding”)
?是“€”。length()==1
?