我试图用java创建一个CSV文件,其中包含一些阿拉伯字母的数据,但是当我打开文件时,我发现阿拉伯字母显示为符号。 这是我的代码:
String csvFilePath = "test.csv";
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(csvFilePath));
fileWriter.write("الاسم ، السن ، العنوان");
CSV 文件中的数据就像这样
ط´ط±ظٹط·
那么我该如何解决这个问题?
如使用 FileWriter (Java) 以 UTF-8 写入文件?中所述,您应该使用
OutputStreamWriter
和 FileOutputStream
而不是 FileWriter
并指定编码:
String csvFilePath = "test.csv";
FileOutputStream file = new FileOutputStream(csvFilePath);
OutputStreamWriter fileWriter = new OutputStreamWriter(file, StandardCharsets.UTF_8);
fileWriter.write("الاسم ، السن ، العنوان");
fileWriter.close();
评论后编辑:
为了确保源代码的编码不是问题,请像这样转义你的 unicode 字符串:
fileWriter.write("\u0627\u0644\u0627\u0633\u0645\u0020\u060c\u0020\u0627\u0644\u0633\u0646\u0020\u060c\u0020\u0627\u0644\u0639\u0646\u0648\u0627\u0646");
在我的例子中,文件定义如下。
String file = fileName+"."+fileExtension;
变量 fileName 与区域设置相关,即在阿拉伯语中它包含“Tõõðь”,在英语中它包含“export”。变量 fileExtension 始终包含“csv”。
现在的问题是,变量文件在阿拉伯语中看起来像“csv.Tõõõь”,在英语中看起来像“export.csv”。
对于阿拉伯语文件来说,这是正确的方式吗?或者它应该看起来像“Tõõðь.csv”?
正如其他人提到的:使用 OutputStreamWriter。此外,您可以将“\uFEFF”写为第一个字符。这将充当字节顺序标记,它可以帮助 Excel 等应用程序了解您使用的编码。
当 Microsoft Excel 以 CSV UTF-8 保存文件时,它会在文件开头添加三个字节。这是一个实现此目的的 java 函数:
public static void makeFileExcelUTF8(String filename) {
try {
Path path = Paths.get(filename);
byte[] fileBytes = Files.readAllBytes(path);
if (fileBytes[0] == (byte) 239 && fileBytes[1] == (byte) 187 && fileBytes[2] == (byte) 191) {
System.out.println(filename + " is already in excel utf8 format");
return;
}
byte[] prefixBytes = new byte[3];
prefixBytes[0] = (byte) 239;
prefixBytes[1] = (byte) 187;
prefixBytes[2] = (byte) 191;
Files.write(path, prefixBytes);
Files.write(path, fileBytes, StandardOpenOption.APPEND);
}
catch (Exception e) {
System.out.println("problem saving into excel utf8 format");
}
}