在java中转换字符串编码

在java中转换字符串编码,java,character-encoding,Java,Character Encoding,关于这个问题: 我的项目编码是UTF-8 我需要对使用特定varchar编码(显然是EUC-KR)的数据库进行查询 我将输入作为UTF-8,并希望使用该字符串的EUC-KR编码版本进行DB查询 首先,我可以使用以下方法选择和显示编码字符串: ResultSet rs = stmt.executeQuery("SELECT name FROM mytable"); while(rs.next()) System.out.println(new String(rs.getBytes(1),

关于这个问题:

我的项目编码是UTF-8

我需要对使用特定varchar编码(显然是EUC-KR)的数据库进行查询

我将输入作为UTF-8,并希望使用该字符串的EUC-KR编码版本进行DB查询

首先,我可以使用以下方法选择和显示编码字符串:

ResultSet rs = stmt.executeQuery("SELECT name FROM mytable");
while(rs.next())
    System.out.println(new String(rs.getBytes(1), "EUC-KR"));
rs.getString(1).getBytes()
rs.getString(1).getBytes("UTF8")
rs.getString(1).getBytes("EUC-KR")
我想做一些类似的事情:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM MYTABLE WHERE NAME=?");
ps.setString(1,input);
ResultSet rs = ps.executeQuery();
这显然不起作用,因为我的Java程序没有使用与DB相同的编码。因此,我尝试用以下各项替换中间线,但均无效:

ps.setString(1,new String(input.getBytes("EUC-KR")));
ps.setString(1,new String(input.getBytes("EUC-KR"), "EUC-KR"));
ps.setString(1,new String(input.getBytes("UTF-8"), "EUC-KR"));
ps.setString(1,new String(input.getBytes("EUC-KR"), "UTF-8"));
我正在使用Oracle 10g 10.1.0

我尝试的更多细节如下:

似乎有效的方法是将第一个查询中的名称保存到字符串中,而不进行任何其他操作,并将其作为参数传递回去。它和它自己相匹配

就是

ResultSet rs = stmt.executeQuery("SELECT name FROM mytable");
rs.next();
String myString = rs.getString(1);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM mytable WHERE name=?");
ps.setString(1, myString);
rs = ps.executeQuery();
。。。将在
rs
中得到1个正确的条目。太好了,所以现在我只需要将输入转换成任何格式

但是,当我尝试使用

byte[] mybytearray = myString.getBytes();
for(byte b : mybytearray)
    System.out.print(b+" ");
换句话说,我可以将
°í»
转换为
고산但我似乎无法打开
고산转换为
°í»ê

字节数组由

rs.getBytes(1)
与以下任何一项给出的字节数组不同:

ResultSet rs = stmt.executeQuery("SELECT name FROM mytable");
while(rs.next())
    System.out.println(new String(rs.getBytes(1), "EUC-KR"));
rs.getString(1).getBytes()
rs.getString(1).getBytes("UTF8")
rs.getString(1).getBytes("EUC-KR")
不幸的是:对于我的数据库,
NLS\u CHARACTERSET=US7ASCII


这意味着我正在尝试做的是不受支持的。感谢大家的参与:(

您是否查看了字符集的正确名称?也许您应该使用UTF8和EUC_KR


希望这不是一个愚蠢的答案,但您是否已确保charsets.jar位于类路径中。默认情况下,它不是。有关详细信息,请参阅

jar文件是JRE的可选功能。要安装它,必须选择“自定义安装”并选择“支持其他地区”功能


使用
字符串
构造函数无法完成任何操作。
字符串
始终在内部使用UTF-16。将UTF-16字符转换为EUC-KR再转换回来对您没有帮助

将无效的Unicode放入
String
值中,希望随后将其转换为EUC-KR,这是一个非常糟糕的主意

您所做的应该是“正常工作”。oracle驱动程序应该与服务器对话,找出所需的字符集,然后从那里开始

然而,什么是数据库字符集?如果有人在存储EUC-KR时没有将字符集设置为EUC-KR,那么您或多或少会陷入困境

您需要做的是告诉您的jdbc驱动程序使用什么字符集与服务器通信。您没有提到如果您使用的是Thin或OCI,答案可能会有所不同

从中判断,您可能需要尝试启用defaultNChar

通常,jdbc驱动程序的工作是将
字符串
转换为Oracle服务器所需的内容。如果使用“OCI”,则可能需要tnsnames.ora选项

编辑

OP报告说,数据库的nls_字符集是US7ASCII。这意味着所有JDBC驱动程序都会认为将Unicode
String
值转换为ASCII是他们的工作。韩语字符最多会减少到?个。那么,从官方角度讲,您的任务就很艰巨了

有一些可能的伎俩可以尝试。其中一个是非常危险的骗局

 new String(string.getBytes("EUC-KR"), "ascii")
这将尝试生成一个Unicode字符字符串,恰好在低字节中包含EUC-KR的值。我相信这会损坏数据,但您可以进行实验

或者,
ps.setBytes(n,string.getBytes(“EUC-KR”))
,但我自己不知道Oracle是否将字节到字符的转换定义为二进制副本。它可能。或者,可能,添加一个以blob为参数的存储过程


实际上,这里需要的是修复数据库以使用UTF-8或EUC-KR的nls_字符集,但这是一个完全不同的工作。

中没有
setName
方法,如果是,它将不会做您想要的事情。使用
setString(1,…)
setBytes(1,…)
。您在这个项目中使用的数据库是什么?那么创建一个自定义SQL查询如何?我已经能够使用字符集标识符“EUC-KR”正确地解码另一个查询中使用的EUC-KR字符。现在我尝试了它,名称“EUC_KR”给出了相同的结果。不过,猜得不错……所以您尝试了ps.setString(1,新字符串(input.getBytes(“UTF8”),“EUC_KR”)?这是一个可怕的黑客行为,可能会损坏数据。好吧,那么在Java端进行转换对我没有帮助吗?现在,我正在使用瘦。我可以尝试使用OCI驱动程序。创建与
Java.util.Properties
配置的连接(将
“defaultNChar”
映射到
true
)在从DB读取结果和向DB传递参数时,似乎没有改变任何行为。是否有某种方法让驱动程序告诉我正确的编码是什么,或者告诉驱动程序使用特定的编码?重要的问题是数据库字符集(而不是nchar集)。它是什么?运行“从nls_database_parameters中选择值,其中parameter='nls_CHARACTERSET';“并报告它所说的内容。如果它没有说EUC-KR,那么生活就很艰难。有人在这里作弊。你有一个将EUC-KR塞进US7ASCII的数据库。是的,一条小溪就是你想要的。你试过ps.setBytes(x,string.getBytes(“EUC-KR”))?:D我也想知道这一点,并尝试使用nio.charset库,使编码器和解码器使用我尝试使用的字符集的所有可选拼写。它们都没有抛出一个
不受支持的harsetException
,或者任何异常,实际上……只在Java的古代版本中需要。事实上,我使用的是jdk 1.5(准确地说是1.5.0.22…链接到的bug报告是1.5.0.05,所以我不知道