0

У меня есть 2 струны, которые меня очень удручают. Они содержат, aparently, тот же текст, но при их сравнении Java не говорит об этом.Одинаковые строки

Текст «La Coruña». Одна строка возвращается через Google Geocoder, а другая - жестко запрограммирована мной.

Я попытался equals(), который возвращает ложь, equalsIgnoreCase() который возвращает ложь, который возвращает ложь, 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), которая отличается от другой жестко закодированной строки.

Пожалуйста, дайте мне некоторую помощь

Спасибо заранее.

+1

Это принципиально разные строки, в соответствии с ASCII. Первый запускает «La», второй - «A». (Один - испанский, другой - галисийский.) –

+0

Что такое «-» для? – realUser404

+0

@OliverCharlesworth Woah! Вы очень похожи, но это была копия опечатки из журналов ошибок. Сожалею! Я обновил свой вопрос. На самом деле контент отличается, но длина такая же. – Alberto

ответ

2

Разница в печатных массивах составляет -61, -79 по сравнению с -47, -127 как представление «-». Отрицательные числа, по-видимому, вы получаете, когда вы печатаете байты, интерпретируемые как подписанные числа (первый бит является битом знака). Рассматривая их как unsigned, поскольку байты в представлениях символов должны обрабатываться, они равны 195, 177 и 209, 129 в десятичной системе, C3, B1 и D1, 81 в шестнадцатеричном формате. Первый - это представление UTF-8 LATIN SMALL LETTER N WITH TILDE U + 00F1. Последнее не имело бы смысла как UTF-8 здесь, поскольку это было бы кириллицей.

Таким образом, первая строка, очевидно, что вы получаете от Google, правильно кодируется UTF-8. Другой, по-видимому, жестко закодированный, просто ошибочен. Из данных данных невозможно определить, откуда исходит ошибка.

+0

Спасибо, что направили меня в правильном направлении. Вы были совершенно правы. Строка Google была в порядке, но hardcoded не был. ** Все мои файлы исходного кода в моем проекте имели кодировку windows-1252 **. Я даже не знаю, почему. После изменения (один за другим) до UTF-8 массивы стали идентичными, и я мог бы их успешно сравнивать. СПАСИБО. – Alberto

Смежные вопросы