使用Java以UTF-8编码保存CSV文件

问题描述 投票:0回答:4

我试图用java创建一个CSV文件,其中包含一些阿拉伯字母的数据,但是当我打开文件时,我发现阿拉伯字母显示为符号。 这是我的代码:

String csvFilePath = "test.csv";
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(csvFilePath));
fileWriter.write("الاسم ، السن ، العنوان");

CSV 文件中的数据就像这样

ط´ط±ظٹط·

那么我该如何解决这个问题?

java csv export-to-csv
4个回答
3
投票

使用 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");

0
投票

在我的例子中,文件定义如下。

String file = fileName+"."+fileExtension; 

变量 fileName 与区域设置相关,即在阿拉伯语中它包含“Tõõðь”,在英语中它包含“export”。变量 fileExtension 始终包含“csv”。

现在的问题是,变量文件在阿拉伯语中看起来像“csv.Tõõõь”,在英语中看起来像“export.csv”。

对于阿拉伯语文件来说,这是正确的方式吗?或者它应该看起来像“Tõõðь.csv”?


0
投票

正如其他人提到的:使用 OutputStreamWriter。此外,您可以将“\uFEFF”写为第一个字符。这将充当字节顺序标记,它可以帮助 Excel 等应用程序了解您使用的编码。


0
投票

当 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");
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.