Java / C#程序访问Oracle数据库,字符串中的错误char

时间:2013-02-22 18:22:50

标签: java oracle character-encoding

我在Oracle中有以下字符串(十六进制转储正好在它下面)。正如你所看到的,在第一个“N”之后,有一个假的字符“0xA6”。我的Oracle实例使用AL32UTF8作为字符编码。

FLOREN�PALACE HOTEL LTDA   
Typ=1 Len=26: 46,4c,4f,52,45,4e,a6,41,20,50,41,4c,41,43,45,20,48,4f,54,45,4c,20,4c,54,44,41

我有两个应该处理这个字符串的服务 - 一个在C#中,另一个在Java中。我在C#中处理这个字符串,它说长度为27.然后我尝试用Java处理这个字符串,它说长度为25.当我用C#打印时,它打印(注意A和空格之前宫)

FLOREN�A PALACE HOTEL LTDA

在Java中,它打印与Oracle相同。

当我在Java程序中从Oracle中选择字符串时,就像Java正在“吃掉”0xA6及其后面的两个字符并将其计为一个字符。我认为Java认为它是一个UTF-8字符(那是Charset),所以它在“0xA6”之后消耗了“A”和“”。

在将“A”和“”与“0xA6”分组时,有没有办法让Java变得不那么激进?

任何建议表示赞赏,

MJ

编辑0

我查看了从Oracle获取字符串的代码。我正在使用Oracle JDBC驱动程序。

Class.forName("oracle.jdbc.OracleDriver");  
m_connection = DriverManager.getConnection(m_connectionString, m_username, m_password);

我的连接字符串是

jdbc:oracle:thin:@//192.168.0.18:1521/serviceName

关于从数据库中实际获取字符串,我使用了ResultSet getBytes,getString,getBinaryStream,getUnicodeStream调用。查看byte [],char []或字符串中的字节,当我使用getBytes时,在0xA6,“A”和“”位置(0xEF,0xBF,0xBD)显示奇怪的字节。

/编辑0

3 个答案:

答案 0 :(得分:0)

看起来数据损坏。可能原始数据是在ISO-8859中编码的,而不是转换为UTF-8。

0xA6本身在ISO-8859-1中是“破损的竖条”¦字符,这是没有意义的,

但是

ISO-8859-2 中,它相当于Unicode 0x015A(带有急性的拉丁文大写字母S)或Ś,看起来很可能。它使整个字符串FLORENŚAALALACEHOTEL LTDA

解决方案是使用正确的UTF-8编码替换该字符,该编码为0xc5 0x9a

答案 1 :(得分:0)

在将字符串convert(your_string, 'AL32UTF8', 'WE8ISO8859P2')传递给Java之前转换它。

答案 2 :(得分:0)

为了后人的缘故,在尝试实施上述建议之一时,我发现OJDBC驱动程序是罪魁祸首,因为我正在改变编码。为了保留编码,我可以删除坏字符,我使用了以下SQL。

从标签中选择utl_raw.cast_to_raw(col);

然后我遍历字节并压缩伪造的角色。