Это звучит как классическая проблема кодирования.Всякий раз, когда вы переносите не-ascii символ, вам нужно убедиться, что вы правильно его кодируете.Для арабского и английского я подозреваю, что вы можете использовать UTF-8 (но я не знаю арабский, так что это может быть неправильно).
В вашей настройке у вас, вероятно, будут следующие пункты:
Browser <-> Servlet container <-> Database
|
System.out
В любом из системных интерфейсов, в которых символы (16-разрядные) преобразуются в байты (8-разрядные), вам необходимо убедиться в правильности кодировки.
Браузерв контейнер сервлета
Когда вы выполняете запросы GET или POST с веб-страницы, браузер просматривает: 1) HTTP-заголовки с сервера, особенно Content-Type: text/html; charset=UTF-8
, который, если присутствует, переопределит HTMLмета заголовок <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
.
На стороне контейнера сервлета HttpServletRequest.getParameter () будет иметь кодировку, которую вам, скорее всего, нужно будет установить в настройках сервера.
Пример tomcat's server.xml
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
maxThreads="2000"
connectionTimeout="20000"
redirectPort="8443" />
Контейнер сервлета в базу данных
База данных должна иметь правильные кодировки, иначе сортировка и т. Д. Будут неправильными.
Пример my.cnf для MySQL
[mysqld]
....
init_connect=''SET collation_connection = utf8_general_ci''
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci
[mysql]
....
default-character-set=utf8
Тогда JDBC-драйвер должен быть установлен для UTF-8.
Пример строки подключения JDBC
jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8
System.out
System.out.printnln()
не может быть использован для проверки.Во-первых, это зависит от кодировки java vm по умолчанию, установленной с помощью System.property -Dfile.encoding=UTF-8
, во-вторых, терминал, в котором вы делаете System.out, должен быть настроен и поддерживать UTF-8.Не доверяйте System.out!
Если строка в виртуальной машине является правильным символом, она не будет затронута кодированием.В памяти каждый символ в строке является 16-битным, что (почти) охватывает все символы, которые может кодировать utf-8.Вы можете записать строку в файл и исследовать файл, чтобы действительно знать , если у вас есть правильные символы в вашей виртуальной машине.