【发布时间】: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 ...