CSV格式的UTF和ISO-8859-1字符编码

时间:2010-12-08 09:08:43

标签: java character-encoding oracle10g

  

可能重复:
  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,因为它是安全的,并且还会正确编码其他语言(中文等){​​{1}}将无法这样做。

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

3 个答案:

答案 0 :(得分:3)

您目前只讨论过程本身就是双面的过程的一部分。

将某些内容编码为字节只是在某些其他进程出现并且在稍后的某个时间将其重新解码回文本的意义上。当然,两个进程都需要使用相同的字符集,否则解码将失败。

因此,对我来说,将数据库的BLOB out 和CSV文件中的过程假定为字节是文本的ISO-8859-1编码。因此,如果将它们存储为UTF-8,则解码混乱(尽管基本的ASCII字符在两者中都具有相同的字节表示,这就是它们仍能正确解码的原因)。

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

答案 1 :(得分:0)

我认为您的BLOB数据是ISO-8859-1编码的。由于它存储为二进制而不是文本,因此其编码不依赖于数据库编码。您应该检查BLOB是否原始使用UTF-8编码编写,如果不是,请执行此操作。

答案 2 :(得分:0)

我认为问题是[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 });

但无济于事。