java - 字符被转换为特殊字符
问题描述
我正在使用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
. 当您CSV
在Excel
不使用文本导入向导的情况下简单地打开时会发生这种情况。然后Excel
总是期望文件开头ANSI
是否没有 a 。BOM
如果您CSV
使用支持的文本编辑器 打开Unicode
,一切都会正确。
例子:
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();
}
}
现在,如果您test.csv
使用支持的文本编辑器 打开Unicode
,一切都会正确。但是,如果您使用它打开相同的文件,Excel
它看起来像:
现在我们做同样的事情,但有
bw.write(0xFEFF); bw.flush(); // write a BOM to the file
积极的。
Excel
当由以下人员test.csv
简单地打开时,这会导致这样的结果Excel
:
当然,更好的方法是始终使用Excel
“文本导入向导” 。
有关相同问题,另请参阅Javascript export CSV encoding utf-8问题。
推荐阅读
- ios - iPhone 应用程序中 Apple Watch 的实时动态信息
- javascript - 在 jquery 验证插件中验证图像的高度宽度
- javascript - Vue.js - 每组仅单击一个按钮以生成动态按钮
- javascript - 带有express js和discord oauth的heroku超大cookie错误
- react-native - 如何在 React Navigation v5 中更改出现在 BottomTab 后面的背景颜色?
- ios - XIB 文件仍在 XCode 和 IOS 开发中使用
- java - 当我将 java 项目导出到可运行 jar 时,log4j 没有发生日志记录
- android - 保护敏感的 Android 字符串
- javascript - 更改行颜色 sql/php
- flutter - 颤振导航器不工作:OnPress 不显示第二个屏幕