簡體   English   中英

字符轉換為特殊字符

[英]Characters get converted into special characters

我正在使用Apache POI讀取.docx文件,並在.csv寫了一些操作后。 我正在使用的.docx文件是法語,但是當我在.csv寫入數據時,它將某些法語字符轉換為特殊字符。 示例Être un membre clé轉換為Être un membre clé

下面的代碼用於寫文件

        Path path = Paths.get(filePath);
        BufferedWriter bw = Files.newBufferedWriter(path);
        CSVWriter writer = new CSVWriter(bw);
        writer.writeAll(data);

默認使用UTF-8

調試時,我在寫入.csv之前已檢查了數據是否保持原樣。 但是它在編寫時被轉換了嗎? 我已將默認語言環境設置為Locale.FRENCH

我錯過了什么嗎?

我懷疑是Excel讀取UTF-8編碼的CSV作為ANSI 當您僅在Excel打開CSV而不使用文本導入向導時,就會發生這種情況。 如果文件開頭沒有BOM ,則Excel總是期望使用ANSI 如果您使用支持Unicode的文本編輯器打開CSV ,則所有內容都是正確的。

例:

import java.io.BufferedWriter;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;

import java.util.Locale;
import java.util.List;
import java.util.ArrayList;

import com.opencsv.CSVWriter;

class DocxToCSV {

 public static void main(String[] args) throws Exception {

  Locale.setDefault(Locale.FRENCH);

  List<String[]> data = new ArrayList<String[]>();
  data.add(new String[]{"F1", "F2", "F3", "F4"});
  data.add(new String[]{"Être un membre clé", "Être clé", "membre clé"});
  data.add(new String[]{"Être", "un", "membre", "clé"});

  Path path = Paths.get("test.csv");
  BufferedWriter bw = Files.newBufferedWriter(path);

  //bw.write(0xFEFF); bw.flush(); // write a BOM to the file

  CSVWriter writer = new CSVWriter(bw, ';', '"', '"', "\r\n");
  writer.writeAll(data);
  writer.flush();
  writer.close();

 }
}

現在,如果您使用支持Unicode的文本編輯器打開test.csv ,那么一切都會正確。 但是,如果您使用Excel打開相同的文件,則它看起來像:

在此處輸入圖片說明

現在我們做同樣的事情

bw.write(0xFEFF); bw.flush(); // write a BOM to the file

活性。

當通過Excel簡單地打開test.csv時,將在Excel以下結果:

在此處輸入圖片說明

當然,更好的方法始終是使用Excel文本導入向導”

有關相同問題,另請參見Javascript導出CSV編碼utf-8問題。

Êtreun membreclé“ UTF8” =Êtreun membreclé©“ ANSI”

檢查您如何讀取最終文件的字符代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM