Вопрос

У меня есть текстовая строка (Java String), которая должна содержать 'gerald.o'leary'.

На самом деле, помимо остальных, он содержит управляющий символ «c2».Я включил шестнадцатеричный дамп, см. image1.png для шестнадцатеричного дампа.

enter image description here

Когда я сохраняю его в базе данных и читаю обратно, запустив SQL в клиенте и скопировав его в шестнадцатеричный редактор, я вижу, что c2 заменен на 3f, см. image2.png.

enter image description here

Я мог бы с этим смириться, если бы не тот факт, что когда эти две строки сравниваются в Java с помощью String.equals(), возвращается false.

Может кто-нибудь объяснить, что здесь происходит?!

Это было полезно?

Решение

Проверили ли вы, может ли ваша база данных SQL хранить символы UTF-8/Unicode (т.е.это не ISO-8859-1, ASCII или аналогичный)?

  • Сначала выведите строку на стандартный вывод, чтобы проверить, действительно ли она содержит правильный символ (?на выходе все в порядке, но ??или 0xC2 0x92 = ´ нет).
  • Затем проверьте набор символов вашей базы данных.См. его руководство.

Другие советы

Я не знаю, как вы получили шестнадцатеричный дамп, но строки Java представляют собой строки Юникода, поэтому между символами и байтами нет соответствия 1:1.Я подозреваю, что ваша строка содержит символы Юникода, которые не могут быть представлены отдельными байтами, и ваша обработка символов (которая предполагает, что это так) ошибочна.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top