[英]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.