这听起来像是一个经典的编码问题。每当您传输非 ascii 字符时,您都需要确保正确编码。对于阿拉伯语和英语,我怀疑您可以使用UTF-8(但我不懂阿拉伯语,所以可能是错误的)。
在您的设置中,您可能会有以下几点:
Browser <-> Servlet container <-> Database
|
System.out
在任何将字符(16 位)转换为字节(8 位)的系统接口中,您都需要确保编码正确。
浏览器到 Servlet 容器
当您从网页执行 GET 或 POST 请求时,浏览器将查看 1) 来自服务器的 HTTP 标头,尤其是Content-Type: text/html; charset=UTF-8
.,如果存在,它将覆盖 HTML 元标头<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
。
在 servlet 容器端,HttpServletRequest.getParameter() 将具有您很可能需要在服务器设置中设置的编码。
示例 tomcat 的 server.xml
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
maxThreads="2000"
connectionTimeout="20000"
redirectPort="8443" />
Servlet 容器到数据库
数据库需要具有正确的编码,否则排序等将不正确。
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
然后需要为 UTF-8 设置 JDBC 驱动程序。
示例 JDBC 连接字符串
jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8
系统输出
System.out.printnln()
不能依靠来验证事情。首先,它取决于 java vm 默认编码,使用 System.property 设置-Dfile.encoding=UTF-8
,其次,执行 System.out 的终端需要设置并支持 UTF-8。不要相信 System.out!
一旦 VM 中的 String 是正确的字符,它就不会受到编码的影响。在内存中,字符串中的每个字符都是 16 位的,它(几乎)涵盖了 utf-8 可以编码的所有字符。您可以将字符串写入文件并调查该文件以真正了解您的 VM 中是否有正确的字符。