Я пытаюсь передать арабскую строку в функцию, которая хранит ее в базе данных, но символы строки преобразуются в '?'

Как пример

String str = new String();
str = "عشب";
System.out.print(str);

Вывод будет:

"???"

И это хранится как это в базе данных.

И если я вставлю в базу данных напрямую, это работает хорошо.

ScreenShot of the code and result

2
Mahmoud S. Marwad 4 Сен 2017 в 03:38

3 ответа

Лучший ответ

Убедитесь, что ваша кодировка символов - utf-8.

Фрагмент, который вы показали, работает отлично, как и ожидалось.

Например, если вы кодируете свои исходные файлы с помощью windows-1252, это не сработает.

2
NimChimpsky 4 Сен 2017 в 00:40

Многие современные операционные системы используют UTF-8 в качестве кодировки по умолчанию, которая будет правильно поддерживать нелатинские символы. Windows не является одной из них, с ANSI по умолчанию в западных установках (я недавно не использовал Windows, так что, возможно, изменился). В любом случае, вам, вероятно, следует принудительно использовать кодировку символов по умолчанию для процесса Java независимо от платформы.

Как описано в другом вопросе Stackoverflow (см. Настройка кодировки символов Java по умолчанию?) вам нужно изменить значение по умолчанию для процесса Java следующим образом:

java -Dfile.encoding=UTF-8

Кроме того, поскольку вы работаете в IDE, вам может потребоваться указать, чтобы он отображал выходные данные в указанной кодировке или повреждении, хотя это зависит от IDE, и точные инструкции будут зависеть от вашей IDE.

Еще одна вещь: если вы читаете или пишете текстовые файлы, вы всегда должны указывать ожидаемую кодировку символов, иначе вы рискуете вернуться к платформе по умолчанию.

1
Andre M 4 Сен 2017 в 03:13

Проблема в том, что System.out.println - это PrintWriter, который преобразует арабскую строку в байты, используя кодировку по умолчанию; который предположительно не может обрабатывать арабские символы. Пытаться

System.out.write(str.getBytes("UTF-8"));
System.out.println();
1
Kathy Van Stone 4 Сен 2017 в 01:39