【问题标题】:String equals printing false in apparently equal strings (encoding)字符串等于在明显相等的字符串中打印 false(编码)
【发布时间】:2014-07-03 16:36:37
【问题描述】:

programacao.getNome() 内部有字符串457P D (0) NOVA PROG 并且在字符串nome 内部有457P D (0)    NOVA PROG。

这是相同的字符串,但编码不同,所以当我运行时 programacao.getNome().equals(nome)) 结果是false。

programacao.getNome().getBytes() 的结果是

[52, 53, 55, 80, 32, 68, 32, 40, 48, 41, 32, 32, 32, 32, 78, 79, 86, 65, 32, 80, 82, 79, 71] 和 nome.getBytes 结果是

[52, 53, 55, 80, -62, -96, 68, -62, -96, 40, 48, 41, -62, -96, -62, -96, -62, -96, -62, -96, 78, 79, 86, 65, -62, -96, 80, 82, 79, 71].

不同之处在于 programação.getNome() 来自数据库 (mysql) 中的字段,而参数 nome 来自 JSF 中的 xhtml 页面,通过实现接口 @ 的类中的方法 getAsObject 987654332@.

我们必须在将其发送到SelectOneMenu之前,用 " " &nbsp @ &nbsp @ &nbsp,以便将其显示在空间中,但是当在下拉列表中选择该项目时,字符串以这种方式进入托管bean。

> >

在xhtml 的顶部,我们放置了encoding="ISO-8859-1",所以这可能是问题所在?我应该从哪里开始寻找?

【问题讨论】:

  • 不要使用getBytes() 来确定差异。将内容转储为 UTF-16 代码单元。类似:for (int i = 0; i < text.length(); i++) { log((int) text.charAt(i); }。然后你可以看到数据真正是什么。不过,从根本上说,nome 看起来根本就不是以“0028”开头的……它看起来像是以“457P”开头的。其余的取决于您机器上的默认编码...
  • 我编辑了这个问题,因为我犯了错误。这也是您发送给我的代码的结果: nome.charAt(i) : 52 53 55 80 32 68 32 40 48 41 32 32 32 32 78 79 86 65 32 80 82 79 71 -------- --------------------- programacao.getNome().charAt(i): 52 53 55 80 194 160 68 194 160 40 48 41 194 160 194 160 194 160 194 160 78 79 86 65 194 160 80 82 79 71
  • 好吧,这两个字符串显然不一样。例如,查看每个字符串中的字符 5。 194 与 32 不同。我还怀疑您实际上应该指定 UTF-8 而不是 ISO-8859-1 ...

标签: html string jsf jsf-2


【解决方案1】:

根据 String.equals(java.lang.Object) 的定义:

将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,结果才为真。 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals%28java.lang.Object%29

我假设你使用的是 java.lang.String,所以问题是两个字符序列不相等。

根据 java.lang.String 文档:

String 表示 UTF-16 格式的字符串

所以您的问题是您将两种不同的编码放入一个字符串中,最终为 UTF-16。在将字符序列放入字符串之前,您需要将其转换为 UTF-16。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多