【问题标题】:Problems with utf-8 on unixunix 上 utf-8 的问题
【发布时间】:2013-12-12 11:21:11
【问题描述】:

我的 CSV 导出有问题。

我创建一个这样的头文件:

/**
 * @param builder
 */
private void createEntete(StringBuilder builder) {
    List<String> entetes = new ArrayList<String>();
    entetes.add("Date Sélectionnée");
    entetes.add("Nom / Prénom des Agents");
    entetes.add("Entité des Agents");
    entetes.add("Créneaux Mains d'Oeuvre ou de la Tournée");
    entetes.add("N° BDT ou Tournée");
    entetes.add("Rubrique du BDT");
    entetes.add("Type du BDT");
    entetes.add("Objet du BDT ou Intitulé de la Disponibilité RH");
    entetes.add("Compte-rendu du BDT");
    entetes.add("Commune");
    entetes.add("Durée du BDT, Tournée ou de l'Activité");
    entetes.add("Durée du Dépassement");
    entetes.add("Motif du Dépassement");

    for (String valeur : entetes) {
        ajoutDonnee(valeur, builder);
    }

}

我使用的是 UTF-8。

特殊字符在我的导出中编码不佳。 我有 é 而不是 é

谢谢。

【问题讨论】:

  • 你能把你输出到csv文件的代码贴出来吗?
  • 我们需要实际写入文件的代码。表头没有问题,你只是在处理一个列表中的字符串。
  • 究竟是哪个软件显示 é 而不是 é?该软件可能不会将您的文件解释为 UTF-8。

标签: java csv utf-8 character-encoding


【解决方案1】:

您没有显示导出/写入数据的代码。

在该代码中,您可以设置合适的编码,例如UTF-8(尽管您的示例文本适用于 CP1252)。

请注意,无论您使用何种方式读取输出数据,都必须设置为使用相同的编码。

因此,您的数据实际上可能写得很好,但当您阅读时看起来是错误的。

例如,尝试执行以下代码:

public static void main(String[] args) throws IOException {
    Writer writer = new OutputStreamWriter(new FileOutputStream("out_default.txt"));
    writer.write("N° BDT ou Tournée");
    writer.close();

    writer = new OutputStreamWriter(new FileOutputStream("out_utf8.txt"), "UTF-8");
    writer.write("N° BDT ou Tournée");
    writer.close();
}

现在尝试在打开文件时打开带有和不带有匹配编码集的输出文件。

我的 Eclipse 默认使用 CP1252 编码。

如果我打开 out_default.txt 文件,我会看到:

N° BDT ou Tournée

如果我打开 out_utf8.txt 文件,我会看到:

N° BDT ou Tournée

但如果我将编辑器的编码设置为 UTF8,那么在 out_utf8.txt 中我会看到:

N° BDT ou Tournée

【讨论】:

  • 当我尝试你的代码时,我有两个文件:N° BDT ou Tournée
  • 在这种情况下,我猜您在该环境中的默认编码是 UTF-8
【解决方案2】:

请注意,在 Unicode 中,像 é 这样的重音字符有两种可能的表示形式:

U+00E9 lower case latin letter E with acute
U+0065 U+0301 lower case latin letter E, non spacing diacritical mark acute

请注意,您的 IDE 或您使用的任何编辑器可能会选择第二种表示,这将导致另一种 UTF-8 表示。 (@tripleee 的反馈表明实际情况并非如此,尽管它仍然可能发生。)

【讨论】:

  • -1 不,这不是问题所在。 é 是 U+00E9 的 UTF-8 表示的 Latin-1 解释。换句话说,输出是正确的,但他使用错误的工具或错误的设置来检查它。
  • @tripleee 我选择了-1,尽管我提到的问题可能仍然会表现出来(可能有不同的垃圾字符)。您根本无法保证 é 确实会在 Unicode 中表示为 U+00e9。我会相应地更新帖子。
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多