最近做一个小东西,客户端用到AsyncHttpClient做get请求,服务端接收处理数据,然后存储到mysql,再从mysql读取数据回传给客户端。
传输数据中需要使用中文,于是乎,各种乱码问题搞了好久,今天总算搞定,在此记录一下,备查。
AsyncHttpClient中文编码
先解决AsyncHttpClient的中文编码问题,AsyncHttpClient将客户端请求数据发送给服务端之前,内部将字符串编码转换成了ISO-8859-1,也就是latin1,于是乎,客户端好好的utf8,传到了服务端再直接传回客户端,也变成了乱码。
自己测试了n次,网上又搜了一圈,才发现是AsyncHttpClient搞的鬼。
搞清楚原因,那么解决方法就很简单了:
在服务端将接收到的数据转换成utf-8,方便后续各种处理。
示例代码如下:
String info = new String(request.getParameter("info").getBytes("ISO-8859-1"), "utf-8");
MySql中文编码
第一个坑解决了,那么来第二个坑。
数据保存到数据库的时候提示出错了,data turncated。
估摸着应该又是中文的锅了,于是又搜了一圈,发现是表内数据编码的问题。
由于表是之前创建的,最初创建的时候,使用的默认的latin1编码,这次插入中文数据,就异常了。
其中一个解决方案如下:
删除数据库,然后新建,然后设置数据库的编码为utf8,示例如下:
alter database info character set utf8;
新建表,记得新建的时候指定字符编码utf8,示例如下:
create table if not exists userinfo(userName varchar(30), pwd varchar(20), info text)default charset utf8
另外,连接数据库时,需要指定使用utf8编码,否则各种语句含有中文时,就会有异常。
指定使用utf8编码连接的代码如下:
public static final String url = "jdbc:mysql://127.0.0.1:3306/info?useUnicode=true&characterEncoding=utf8";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "123";
private static Connection conn = null;
public static Connection getCon(){
if(conn != null){
return conn;
}
try {
Class.forName(name);//指定连接类型
conn = DriverManager.getConnection(url, user, password);//获取连接
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
另外,附上一个查看编码的语句:
show variables like 'char%';
以上,要保证数据库和数据表的编码都为utf8,连接时也使用utf8。