相同的字符串是不同的

时间:2014-12-02 23:29:47

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

我有2个字符串让我很沮丧。 它们通常包含相同的文本,但在比较它们时,Java并没有这么说。

文字是“LaCoruña”。一个字符串通过Google Geocoder返回,另一个字符串由我硬编码。

我尝试equals()返回false,equalsIgnoreCase()返回false,contains()返回false,compareTo()返回0(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正在使用某种编码(“LaCoruña”包含ñchar),这种编码与其他硬编码字符串不同。

请给我一些帮助

提前致谢。

1 个答案:

答案 0 :(得分:2)

印刷阵列的差异是-61,-79对比-47,-127作为“ñ”的表示。当你打印解释为有符号数字的字节(第一位是符号位)时,负数显然是你得到的。将它们视为无符号,应该处理字符表示中的字节,它们是195,177对209,129十进制,C3,B1对D1,181以十六进制表示。前者是LATIN SMALL LETTER N WITH TILDE U + 00F1的UTF-8表示。后者在这里作为UTF-8毫无意义,因为它将是一封西里尔字母。

因此,第一个字符串,显然是从谷歌获得的,是正确的UTF-8编码。另一个,显然是硬编码的,简直是错误的。根据给定的数据,无法推断出错误的来源。