【问题标题】:Special Characters and Java String特殊字符和 Java 字符串
【发布时间】:2012-10-02 19:45:43
【问题描述】:

我有应该包含'gerald.o'leary' 的文本字符串(Java 字符串)。

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

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

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

有人可以解释一下这里发生了什么吗?!

【问题讨论】:

  • 其实c2 92正在被3f取代。将两个字节减少为一个很明显,这是某个地方的编码问题。
  • 您遇到了字符编码问题。我猜原始文本包含一个智能引用。该文本是如何进入您的 Java 字符串的?是在网页的表格中输入的吗?
  • 我正在通过 JAXB 读取一个包含 HR 数据的 XML 文件,相关字段是电子邮件地址。

标签: java string control-characters


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我使用的是 SQLServer 2008,不确定它的字符集,将检查。
    猜你喜欢
    • 2019-02-09
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2016-10-01
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多