【问题标题】:Same strings are different相同的字符串不同
【发布时间】:2015-01-31 09:10:31
【问题描述】:

我有 2 个字符串让我很沮丧。 显然,它们包含相同的文本,但在比较它们时,Java 不会这么说。

文字是“拉科鲁尼亚”。一个字符串是通过 Google Geocoder 返回的,另一个是我硬编码的。

我试过equals()返回false,equalsIgnoreCase()返回false,contains()返回false,compareTo()不返回0(等于0)。

然后我将字符串转储到字节数组中,每个都使用getBytes("UTF-8") 方法。 同样,equals() 返回 false,Arrays.compare(array1, array2) 也返回 false。

Arrays.compare() 当每个数组的长度不同或相同位置的值不同时返回 false。所以我打印了两个数组和......惊喜!内容不一样。 像这样:
Array1 [76, 97, 32, 67, 111, 114, 117, -61, -79, 97]
Array2 [76, 97, 32, 67, 111, 114, 117, -47, -127, 97]

问题是为什么会发生这种情况以及如何使它们相等,以便我可以成功比较。 我的猜测是 Google 使用了某种不同于其他硬编码字符串的编码(“La Coruña”包含 ñ char)。

请给我一些帮助

提前致谢。

【问题讨论】:

  • 根据 ASCII,这些是根本不同的字符串。第一个开始“La”,第二个开始“A”。 (一个是西班牙人,另一个是加利西亚人。)
  • @OliverCharlesworth 哇!你是对的,但这是从错误日志中复制的拼写错误。对不起!我已经更新了我的问题。其实内容不同,但长度是一样的。
  • 仍然是“La”与“LA”恕我直言。虽然不知道“ñ”
  • @realUser404 是的,谢谢。这是一个错字。我已经花了好几个小时来处理这个问题,现在我看不到那些小细节。我不想浪费你的时间,对不起。我使用了在线十进制到文本转换器,区别仅在于 ñ 部分。

标签: java android character-encoding string-comparison non-ascii-characters


【解决方案1】:

打印的数组的区别是 -61、-79 与 -47、-127 作为“ñ”的表示。当您打印解释为有符号数的字节(第一位是符号位)时,负数显然是您得到的。将它们视为无符号,因为应处理字符表示中的字节,它们是十进制的 195、177 与 209、129,C3、B1 与 D1、十六进制的 81。前者是LATIN SMALL LETTER N WITH TILDEU+00F1 的UTF-8 表示。后者在这里作为 UTF-8 没有意义,因为它是一个西里尔字母。

因此,第一个字符串,显然是您从 Google 获得的,是正确的 UTF-8 编码的。另一个,显然是硬编码的,完全是错误的。从给定的数据中,无法推断出错误的来源。

【讨论】:

  • 感谢您为我指明正确的方向。你完全正确。谷歌的字符串没问题,但硬编码的不行。 我项目中的所有源代码文件都有 windows-1252 编码。我什至不知道为什么。在(一一)更改为 UTF-8 后,数组变得相同,我可以成功比较它们。谢谢。
猜你喜欢
  • 2012-09-06
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 2012-09-11
  • 2011-04-28
  • 2012-05-01
相关资源
最近更新 更多