2015-05-07 85 views
0

我必须在文档中找到用户定义的字符串(使用Java),该字符串存储在BLOB的数据库中。当我搜索带有特殊字符的字符串(“Umlaute”,äöü等)时,它会失效,这意味着它根本不会返回任何位置。我不允许将文档的内容转换为UTF-8(它可以解决这个问题,但提出了一个新的,甚至更大的问题)。Java:使用错误的编码字符串进行搜索而不对其进行修改

一些附加信息: 该文档的内容在“ISO-8859-1”(Latin1)中以字符串形式返回。 下面是一个例子,一个字符串可能看起来是这样的:

Die Erkenntnis, daà der Künstler Schutz braucht, ... 

这是应该的样子:

Die Erkenntnis, daß der Künstler Schutz braucht, ... 

如果我在寻找Künstler将无法​​找到它,因为它查找ü,但只能找到ü

是否有可能将Künstler转换为Künstler,以便我可以搜索错误的编码版本?

注意: 我们正在使用Hibernate Framework for Database访问。文档内容的原始Getter返回byte[]。字符串的长度超出致电

new String(getContent(), "ISO-8859-1") 

这里的问题是,我不能将其更改为UTF-8返回,因为它会那么乱了我们的应用程序的其余部分是基于第三方应用程序,可提供数据这种方式。

+0

如果您确定DB包含Latin-1编码数据,您可以使用''Künstler“.getBytes(”ISO-8859-1“)'从Künstler中获取字节,尽管''看起来像两个字符'ü'的Latin-1不是这种情况。 –

+0

@GáborBakos问题在于,我需要comperator String('Künstler')作为** String **。如果我将字节数组转换回来,结果仍然是'Künstler',但我需要'Künstler'。 看起来像故意搞乱编码比想象的更难:D – rGunti

+0

请显示更多的代码,比如你如何从blob中搜索和提取数据。 –

回答

1

好吧,看起来我已经找到了一种方法来破解编码的目的。

new String("Künstler".getBytes("UTF-8"), "ISO-8859-1") 

通过获得字符串Künstler的字节在UTF-8,然后创建一个新的字符串,告诉Java的,这是Latin1的,将其转换为Künstler。这是一个黑客的地狱,但似乎运作良好。

0

已经自己回答了。

的altoghether不同的方法: 如果你可以搜索BLOB,您可以搜索使用

"SELECT .. FROM ... WHERE" 
+ " ... LIKE '%" + key.replaceAll("\\P{Ascii}+", "%") + "%'" 

这由%通配符代替非ASCII序列:UTF-8多字节序列的非ASCII通过设计。

相关问题