我有文本字符串(Java 字符串),其中应包含 'gerald.o'leary'.

实际上,除了其余字符“c2”之外,它还包含一个控制字符。我已经包含了十六进制转储,请参阅 image1.png 对于十六进制转储。

enter image description here

当我将其保存到数据库并通过在客户端中运行 SQL 读取它并将其复制粘贴到十六进制编辑器时,我看到 c2 被 3f 替换,请参阅 image2.png.

enter image description here

我本可以接受它,但事实上,当在 Java 中使用 String.equals() 比较这两个字符串时,会返回 false。

有人可以解释一下这是怎么回事吗?

有帮助吗?

解决方案

您是否检查过您的 SQL DB 是否可以存储 UTF-8/Unicode 字符(即它不是 ISO-8859-1、ASCII 或类似的)?

  • 首先将字符串输出到标准输出,看看它是否真的包含正确的字符(?输出很好,但是??或 0xC2 0x92 = ´ 不是)。
  • 然后检查你的数据库字符集。请参阅其手册。

其他提示

我不知道你是如何获得十六进制转储的,但是java字符串是unicode字符串,因此字符和字节之间没有1:1的对应关系。我怀疑您的字符串包含无法用单个字节表示的 unicode 字符,并且您的字符处理(假设情况如此)有问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top