これは、古典的なエンコーディングの問題のように聞こえます。非ASCII文字を転送するときは常に、正しくエンコードされていることを確認する必要があります。アラビア語と英語の場合、 UTF-8を使用できると思います(ただし、アラビア語はわからないため、間違っている可能性があります)。
セットアップでは、おそらく次の点があります。
Browser <-> Servlet container <-> Database
|
System.out
文字(16ビット)がバイト(8ビット)に変換されるシステムインターフェイスでは、エンコーディングが正しいことを確認する必要があります。
ブラウザからサーブレットコンテナへ
WebページからGETまたはPOSTリクエストを実行すると、ブラウザは1)サーバーからのHTTPヘッダー、特に、Content-Type: text/html; charset=UTF-8
存在する場合はHTMLメタヘッダーをオーバーライドするHTTPヘッダーを確認します<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
。
サーブレットコンテナ側では、HttpServletRequest.getParameter()に、サーバー設定で設定する必要がある可能性が最も高いエンコーディングが含まれます。
tomcatのserver.xmlの例
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
maxThreads="2000"
connectionTimeout="20000"
redirectPort="8443" />
データベースへのサーブレットコンテナ
データベースには正しいエンコーディングが必要です。そうでないと、並べ替えなどが正しくありません。
MySQLのmy.cnfの例
[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()
物事を検証するために信頼することはできません。まず、System.propertyを使用して設定されたjava vmのデフォルトのエンコーディングに依存します-Dfile.encoding=UTF-8
。次に、System.outを実行する端末を、UTF-8に設定してサポートする必要があります。System.outを信用しないでください!
VM内の文字列が適切な文字になると、エンコーディングの影響を受けなくなります。メモリ内では、文字列内のすべての文字は16ビットであり、utf-8がエンコードできるすべての文字を(ほぼ)カバーします。文字列をファイルに書き込み、ファイルを調べて、VMに正しい文字が含まれているかどうかを実際に知ることができます。