3

我在 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 不那么激进?

任何建议表示赞赏,

编辑 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 调用。例如,当我使用 getBytes 时,查看 byte[]、char[] 或 string 中的字节会显示 0xA6、“A”和“”位置(0xEF、0xBF、0xBD)中的奇怪字节。

/编辑 0

4

3 回答 3

0

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

0xA6在 ISO-8859-1 中,它本身就是“断开的竖线”¦字符,这没有意义,

但是

ISO-8859-2中,它等同于 Unicode 0x015A(拉丁文大写字母 S 带尖音)或 Ś,看起来很可能。它使整个字符串FLORENŚA PALACE HOTEL LTDA

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

于 2013-02-22T19:21:34.903 回答
0

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

于 2013-02-22T19:59:23.380 回答
0

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

从选项卡中选择 utl_raw.cast_to_raw( col );

然后我遍历字节并压扁了虚假字符。

于 2013-02-25T20:01:16.780 回答