Java: 在不修改的情况下搜索错误编码的字符串
Java: Search in a wrong encoded String without modifying it
我必须在文档中找到用户定义的字符串(使用 Java),它存储在数据库中的 BLOB 中。当我搜索带有特殊字符("Umlaute"、äöü 等)的字符串时,它失败了,这意味着它根本没有 return 任何位置。而且我不允许将文档的内容转换为 UTF-8(这本来可以解决这个问题,但会引发一个新的、甚至更大的问题)。
一些附加信息:
文档的内容被 return 编辑为 "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 进行数据库访问。文档内容 return 的原始 Getter 是 byte[]
。字符串比 return 通过调用
编辑
new String(getContent(), "ISO-8859-1")
这里的问题是,我不能将其更改为 UTF-8,因为它会弄乱我们基于第三方应用程序以这种方式传送数据的应用程序的其余部分。
好的,看来我找到了一种故意弄乱编码的方法。
new String("Künstler".getBytes("UTF-8"), "ISO-8859-1")
通过获取 UTF-8 字符串 Künstler
的字节,然后创建一个新字符串,告诉 Java 这是 Latin1,它转换为 Künstler
。这真是一个骇人听闻的黑客,但似乎运作良好。
自己已经回答了。
完全不同的方法:
如果可以搜索 blob,则可以使用
进行搜索
"SELECT .. FROM ... WHERE"
+ " ... LIKE '%" + key.replaceAll("\P{Ascii}+", "%") + "%'"
这用 %
通配符替换了非 ASCII 序列:UTF-8 多字节序列在设计上是非 ASCII 的。
我必须在文档中找到用户定义的字符串(使用 Java),它存储在数据库中的 BLOB 中。当我搜索带有特殊字符("Umlaute"、äöü 等)的字符串时,它失败了,这意味着它根本没有 return 任何位置。而且我不允许将文档的内容转换为 UTF-8(这本来可以解决这个问题,但会引发一个新的、甚至更大的问题)。
一些附加信息: 文档的内容被 return 编辑为 "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 进行数据库访问。文档内容 return 的原始 Getter 是 byte[]
。字符串比 return 通过调用
new String(getContent(), "ISO-8859-1")
这里的问题是,我不能将其更改为 UTF-8,因为它会弄乱我们基于第三方应用程序以这种方式传送数据的应用程序的其余部分。
好的,看来我找到了一种故意弄乱编码的方法。
new String("Künstler".getBytes("UTF-8"), "ISO-8859-1")
通过获取 UTF-8 字符串 Künstler
的字节,然后创建一个新字符串,告诉 Java 这是 Latin1,它转换为 Künstler
。这真是一个骇人听闻的黑客,但似乎运作良好。
自己已经回答了。
完全不同的方法: 如果可以搜索 blob,则可以使用
进行搜索"SELECT .. FROM ... WHERE"
+ " ... LIKE '%" + key.replaceAll("\P{Ascii}+", "%") + "%'"
这用 %
通配符替换了非 ASCII 序列:UTF-8 多字节序列在设计上是非 ASCII 的。