Java中的编码问题

Java中的编码问题,java,encoding,oracle10g,Java,Encoding,Oracle10g,我有一个包含ASCII和Unicode字符的CSV文件。说“ÔÔA”。我不确定这个文件的编码格式,但当我在记事本中打开它时,它显示“ANSI”作为其编码标准 我以UTF-8编码格式获取CSV的这些内容 fr=新的InputStreamReader(新文件InputStream(文件名),“UTF-8”) 但当我将其存储在DB中时,这些特殊字符(除了“A”)没有正确存储。角色被搅乱了 我希望所有的字符都能妥善保存。有什么想法吗?您的数据库字段支持unicode吗?在MSSQL中,字段类型必须是nv

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

我以UTF-8编码格式获取CSV的这些内容

fr=新的InputStreamReader(新文件InputStream(文件名),“UTF-8”)

但当我将其存储在DB中时,这些特殊字符(除了“A”)没有正确存储。角色被搅乱了


我希望所有的字符都能妥善保存。有什么想法吗?

您的数据库字段支持unicode吗?在MSSQL中,字段类型必须是nvarchar over varchar。您正在使用什么数据库?

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

我建议创建一个小程序,从文件中读取,并打印出读取字符的unicode值,这样可以确保显示的值是正确的。有代码图表可在-你可能可以做的基本拉丁和拉丁-1图表


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

有这个问题。您需要两件事:NVARCHAR2列和preparedstatement上的oracle特定方法调用,以通知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);
}
如果使用带有unicode字符的纯SQL字符串,这就像Oracle获取UTF-8中的所有SQL命令一样:驱动程序会自动转换。然而,对于准备好的语句,您需要明确地告诉oracle

如果您运行Java6并拥有ojdbc6驱动程序,您也可以尝试。(在我的例子中,我们必须将Java 5与版本4驱动程序一起使用——不要问为什么)


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

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

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


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

您需要在ISO 8859-1而不是UTF-8中对其进行编码。

您可以手动将字符输出的十六进制转储与各种编码()进行比较,尽管这可能是一个费力的过程。或者,您可以使用库来尝试使用,尽管这并不是一种万无一失的方法


CSV文件是如何生成的?如果它是由英文操作系统上的Windows应用程序创建的,那么编码可能是();在波兰制度下,可能是这样。最好的方法是确定文件保存的编码方式。

从文件中加载字符串后,首先要做的是对其进行System.out.println()处理。如果控制台中的文件已损坏,则您的文件实际上不是UTF-8,如果看起来不错,那么您在将其保存到数据库的方式上就有问题:)

使用十六进制编辑器/转储程序检查该文件,查看哪些字节实际表示这些非ASCII字符。我认为Oracle 10g允许您使用UTF-8或UTF-16作为国家字符集列存储格式。默认情况下,它是UTF-16.kd304:您还可以将UTF-8指定为CHAR(VARCHAR,VARCHAR2)列的字符集,因此数据库中的每个字符串都是UTF8。如果他/她接收到UTF-8格式的数据,为什么他/她要将其转换为较小的格式?Oracle非常能够处理unicode文本。好主意。可以使用oracle的DUMP()函数逐字节查看字符串在列中的存储方式,并将其与原始文件的字节序列进行比较。