2009-06-23 73 views
5

我有一个CSV文件,其中包含ASCII & Unicode字符。说“ÅÔÉA”。我不确定这个文件的编码格式,但是当我在记事本中打开它时,它显示“ANSI”作为它的编码标准。Java中的编码问题

我以UTF-8编码格式获取这些CSV内容。 (新的FileInputStream(文件名),“UTF-8”);新的InputStreamReader(新的FileInputStream(文件名),“UTF-8”);

但是当我在DB中存储这些特殊字符,除了“A”,没有正确存储。字符得到加扰

我希望所有的字符都能正确存储。任何想法?

+0

使用十六进制编辑器/倾卸器检查文件看看哪些字节实际上代表那些非ASCII字符。 – laalto 2009-06-23 06:41:30

回答

0

你的数据库字段是否支持unicode?在MSSQL中,字段类型必须是varchar over varchar。你使用的是哪个数据库?

6

“记事本”中的“ANSI”表示您的Windows正在使用的任何代码页。 尝试ISO8859-1,它在大多数情况下工作。

1

我建议创建一个小程序,它从文件中读取并打印出所读取字符的Unicode值,这样可以确保显示的值是正确的。在http://www.unicode.org/charts/有代码图 - 您可能可以使用基本拉丁和拉丁-1图表。

我的猜测是编码是本地Windows编码。然后,您可以完全避免“UTF-8”参数,并让Java使用默认的平台编码。

2

有这个问题。你需要两样东西:对PreparedStatement的NVARCHAR2列和Oracle特定的方法调用以通知的字符串编码预言:

/** 
* Sets a statement parameter as NCHAR. Use before setting the field value. 
* @param pstmt the prepared statement 
* @param index the parameter index 
*/ 
public static void setNChar(PreparedStatement pstmt, int index) { 
    OraclePreparedStatement opstmt = (OraclePreparedStatement)pstmt; 
    opstmt.setFormOfUse(index, OraclePreparedStatement.FORM_NCHAR); 
} 

如果使用普通的SQL字符串使用Unicode字符,可以作为甲骨文得到所有的SQL命令UTF-8:驱动程序自动翻译。但是,对于准备好的语句使用你需要明确地告诉oracle。

如果您运行Java 6并具有ojdbc6驱动程序,您也可以尝试PreparedStatement.setNString()。 (在我的情况下,我们必须使用Java 5与版本4驱动程序 - 不要问为什么)

(注意:我知道这是供应商锁定,因为您被迫使用具体的oracle类而不是jdbc接口)

2

首先,你需要知道文件的编码。用hexeditor打开它。一个字符占用多少字节?如果它只有一个,那么该文件不是UTF-8,而更可能是某些ISO-8859或类似的Windows编码(例如Win-1252)。如前所述,机会是ISO-8859-1是正确的编码。对于东欧语言,ISO-8859-2将是正确的选择。

第二个问题是您的数据库支持字符列的字符集(该参数在安装/创建新实例期间设置),但由于您可以直接插入这些字符,因此在这种情况下它不会成为问题。

您使用哪个jdbc驱动程序?如果客户端的NLS_LANG设置与数据库的字符编码不匹配,那么精简驱动程序不应该在这方面发生任何问题,而OCI驱动程序可能会产生额外的问题层。

+0

我认为Oracle 10g允许您为国家字符集列存储格式使用UTF-8或UTF-16。默认情况下它是UTF-16。 – akarnokd 2009-06-23 08:23:56

+0

kd304:您还可以指定UTF-8作为CHAR(VARCHAR,VARCHAR2)列的字符集,因此数据库中的每个字符串都是UTF8。 – 2009-06-23 08:58:34

0

您需要在ISO 8859-1中编码,而不是在UTF-8中编码。

+1

如果他/她以UTF-8接收数据,他/她为什么要将其转码为较小的格式? Oracle能够处理unicode文本。 – akarnokd 2009-06-23 08:25:32

0

您可以手动比较字符输出的十六进制转储和各种编码(sample code),虽然这可能是一个费力的过程。或者,您可以使用ICU库尝试使用determine the encoding,虽然这不是一个简单的方法。

CSV文件是如何生成的?如果它是由英文OS上的Windows应用程序创建的,则编码可能是windows-1252canonical name "Cp1252" in Java);在波兰系统上,它可能是windows-1250。最好的方法是找出保存文件的编码方式。

0

第一件要做的事情就是从文件中加载字符串的System.out.println()。如果它在控制台中损坏,那么你的文件实际上并不是UTF-8,如果它看起来很好,那么你将它保存到数据库的方式有问题:)