我在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
答案 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);
然后我遍历字节并压缩伪造的角色。