Java CSV中的字符编码UTF和ISO-8859-1

Java CSV中的字符编码UTF和ISO-8859-1,java,character-encoding,oracle10g,Java,Character Encoding,Oracle10g,可能重复: 我的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 Zip

可能重复:

我的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");
PrintStream out = new PrintStream(zipOut,false,"ISO-8859-1");
如果我使用上述代码,csv中的德语字符(从表中提取)将变得乱七八糟。但是如果我将编码更改为使用
ISO-8859-1
,那么我可以在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");
PrintStream out = new PrintStream(zipOut,false,"ISO-8859-1");
我在一些帖子中读到,我们应该使用UTF8,因为它是安全的,并且会正确地编码其他语言(中文等),而
ISO-8859-1
将无法做到这一点


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

您目前谈论的只是一个过程的一部分,这个过程本质上是双向的

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

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


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

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

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

但是,即使我在PrintStream上添加了BOM表,我仍然无法解决这个问题

PrintStream out = new PrintStream(zipOut,false,"UTF-8"); 
out.write('\ufeff');
我还尝试:

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

但是没有用。

我如何检查创建BLOB时使用的编码?好吧,通过使用能够正确显示字符的编码对其进行解码。有一些工具尝试检测编码,但是如果你的BLOB使用ISO-8859-1解码良好,那么它就是ISO-8859-1编码的。嗨,Andrzej,我怎么能用记事本打开同一个文件?可能是因为记事本尝试了多个字符集,或者分析了文件,或者碰巧猜到了正确的一个?我不知道。但我可以说的是,你可以在记事本中打开文件,因为记事本正在用正确的字符集(“正确的”是它们编码的字符集)解码光盘上的字节。这实际上可能会帮助你:有些东西不正确。您声称数据库将文本存储为UTF-8,但当您用UTF-8写出文本时,它是胡言乱语;必须在ISO-8859-1中写出,以便于阅读。这似乎是非常明显的证据,表明数据库的文本不是存储为UTF-8,而是存储为ISO-8859-1。我检查了数据库的NLS_字符集,它的值为UTF8。一件有趣的事情是,我可以用记事本打开csv,我可以正确地看到这些字符。这就解决了。请检查这个