【问题标题】:Character encoding UTF and ISO-8859-1 in CSV [duplicate]CSV中的字符编码UTF和ISO-8859-1 [重复]
【发布时间】:2011-05-22 02:35:28
【问题描述】:

可能重复:
How to add a UTF-8 BOM in java

我的 oracle 数据库有一个 UTF8 字符集。 我有一个 Java 存储过程,它从表中获取记录并创建一个 csv 文件。

BLOB retBLOB = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
retBLOB.open(BLOB.MODE_READWRITE);
OutputStream bOut = retBLOB.setBinaryStream(0L);
ZipOutputStream zipOut = new ZipOutputStream(bOut);
PrintStream out = new PrintStream(zipOut,false,"UTF-8");

如果我使用上面的代码,德文字符(从表中获取)在 csv 中会变成乱码。但是如果我将编码更改为使用ISO-8859-1,那么我可以在csv文件中正确地看到德语字符。

PrintStream out = new PrintStream(zipOut,false,"ISO-8859-1");

我读过一些帖子说我们应该使用 UTF8,因为它是安全的,并且还能正确编码其他语言(中文等),而 ISO-8859-1 将无法这样做。

请建议我应该使用哪种编码。 (将来我们很有可能将中文/日文单词存储在表中。)

【问题讨论】:

  • 有些东西没有加起来。您声称数据库将文本存储为 UTF-8,但是当您以 UTF-8 写出文本时,它是乱码;它必须用 ISO-8859-1 写出来才能阅读。这似乎是一个非常明显的证据,表明数据库的文本不是以 UTF-8 而是以 ISO-8859-1 存储的。
  • 我检查了数据库的 NLS_CHARACTERSET,它的值为 UTF8。一件有趣的事,我可以用记事本打开 csv,我可以正确地看到这些字符。
  • 已解决。请检查此link

标签: java character-encoding oracle10g


【解决方案1】:

您目前只谈论一个本质上是双向的流程的一部分。

将某些内容编码为字节仅在某些其他过程出现并在稍后将其解码回文本的意义上真正相关。当然,两个进程需要使用相同的字符集,否则解码将失败。

所以在我看来,将 BLOB out 从数据库中取出并放入 CSV 文件的过程是假设字节是 ISO-8859-1 文本编码。因此,如果您将它们存储为 UTF-8,则解码混乱(尽管基本 ASCII 字符在两者中具有相同的字节表示,这就是它们仍然正确解码的原因)。

UTF-8 是一种在几乎所有情况下都可以使用的良好字符集,但它不足以克服必须使用相同字符集进行解码和用于编码的不变法则.因此,您可以将 CSV 创建器更改为使用 UTF-8 进行解码,否则您必须继续使用 ISO-8859-1 进行编码。

【讨论】:

  • 嗨 Andrzej,我怎么能用记事本打开同一个文件?
  • 可能是因为记事本尝试了多个字符集,或者分析了文件,或者只是碰巧猜对了?我不知道。但我可以说的是,您可以在记事本中打开文件,因为记事本正在使用正确的字符集(“正确”是它们被编码的字符集)解码磁盘上的字节。
【解决方案2】:

我想您的 BLOB 数据是 ISO-8859-1 编码的。由于它存储为二进制而不是文本,因此其编码不依赖于数据库编码。您应该检查 BLOB 是否最初是用 UTF-8 编码编写的,如果不是,请这样做。

【讨论】:

  • 如何检查用于创建 BLOB 的编码?
  • 好吧,通过使用可以正确显示字符的编码对其进行解码。有一些工具会尝试检测编码,但如果您的 BLOB 使用 ISO-8859-1 解码良好,那么它就是 ISO-8859-1 编码。
【解决方案3】:

我认为问题在于 [Excel]csv 无法识别 utf8 编码。 utf-8 csv issue

但即使我在 PrintStream 上放置了 BOM,我仍然无法解决问题。

PrintStream out = new PrintStream(zipOut,false,"UTF-8"); 
out.write('\ufeff');

我也试过了:

out.write(new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF });

但无济于事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2011-07-26
    • 2011-04-07
    相关资源
    最近更新 更多