Специальные символы и строка Java
-
12-12-2019 - |
Вопрос
У меня есть текстовая строка (Java String), которая должна содержать 'gerald.o'leary'
.
На самом деле, помимо остальных, он содержит управляющий символ «c2».Я включил шестнадцатеричный дамп, см. image1.png
для шестнадцатеричного дампа.
Когда я сохраняю его в базе данных и читаю обратно, запустив SQL в клиенте и скопировав его в шестнадцатеричный редактор, я вижу, что c2 заменен на 3f, см. image2.png
.
Я мог бы с этим смириться, если бы не тот факт, что когда эти две строки сравниваются в Java с помощью String.equals(), возвращается false.
Может кто-нибудь объяснить, что здесь происходит?!
Решение
Проверили ли вы, может ли ваша база данных SQL хранить символы UTF-8/Unicode (т.е.это не ISO-8859-1, ASCII или аналогичный)?
- Сначала выведите строку на стандартный вывод, чтобы проверить, действительно ли она содержит правильный символ (?на выходе все в порядке, но ??или 0xC2 0x92 = ´ нет).
- Затем проверьте набор символов вашей базы данных.См. его руководство.
Другие советы
Я не знаю, как вы получили шестнадцатеричный дамп, но строки Java представляют собой строки Юникода, поэтому между символами и байтами нет соответствия 1:1.Я подозреваю, что ваша строка содержит символы Юникода, которые не могут быть представлены отдельными байтами, и ваша обработка символов (которая предполагает, что это так) ошибочна.