开发中乱码问题整理
记录乱码问题
1. HttpClient 引入乱码问题
原有代码:
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(textBody, dataJsonObject.toString(), ContentType.MULTIPART_FORM_DATA);
builder.setCharset(Consts.UTF_8);
HttpEntity multipart = builder.build();
问题描述:
HttpEntity是构建一个请求体,在该请求体重添加了textBody,也就是json字符串内容,使用了multipart/form-data 的content-type,将数据发送到url服务器中,但是url服务器解析的时候乱码了,解析的时候是按UTF-8进行解析的。
排查问题:
builder.setCharset(Consts.UTF_8);明明使用了setCharset编码,觉得就没有问题了,但是这个方法并不能对请求体中的一个key的value进行编码
然后看了ContentType.MULTIPART_FORM_DATA这个变量
MULTIPART_FORM_DATA = create("multipart/form-data", Consts.ISO_8859_1);
没想到默认使用ISO_8859_1编码方式的,可能推送的数据就以ISO_8859_1进行编码了,然后对方使用UTF-8解码肯定就乱码了。
解决方法:
builder.addTextBody(textBody, dataJsonObject.toString(), ContentType.MULTIPART_FORM_DATA.withCharset("UTF-8"));
更改MULTIPART_FORM_DATA的编码方式。
问题:
- ISO_8859_1与UTF-8,ASCAII编码有什么区别
答: 最早的编码是iso8859-1,和ascii编码相似,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列,UTF-8是可以国际编码,包含了全部的中文字符。
2.文件写入问题 (未理解)
问题描述:
创建一个文件,向文件写入带中文字符的内容,文件生成后打开问题乱码,并且查看编码方式为GB2312
原来代码:
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)))){
bw.write(content);
bw.flush();
};
排除:
在String s = new String("fdasadff");的时候,默认的编码格式是项目的编码格式,项目采用的编码格式可以通过idea的setting查看
因此,在这里的s的编码方式就算UTF-8的编码方式。
可以通过如下代码进行验证
String s = new String("发货顺丰多久啊司法局大家放松323432斯柯达");
System.out.println(new String(s.getBytes("GBK")));
System.out.println(new String(s.getBytes("UTF-8")));
����˳���ð�˾���ִ�ҷ���323432˹�´�
发货顺丰多久啊司法局大家放松323432斯柯达
如果将project encoding修改成GBK
再运行相同的代码得到如下输出
发货顺丰多久啊司法局大家放松323432斯柯达
鍙戣揣椤轰赴澶氫箙鍟婂徃娉曞眬澶у鏀炬澗323432鏂煰杈?
因此也验证了上述说的结论。
问题继续排除,之所以上述为出现乱码,是因为当时idea设置了GBK的编码方式。
但是new FileOutputStream(file)会对file指定什么编码方式,按道理就会指定对应的项目文件编码方式,如果是UTF-8,则会编译成UTF-8?
解决问题:
输入流,是可以指定输入流的编码方式的,如果不指定则默认为使用文件的编码方式,如果文件a.txt的编码就算GBK,则读取的时候的字节也是GBK编码过的,如果文件是UTF-8,则读取的也是UTF-8的字节。解决的时候把IDEA的编码设置了UTF-8,然后为了之后编码又弄错了,在声明输出流的时候,指定了输出编码方式。
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,"UTF-8")))){
bw.write(content);
bw.flush();
};
3.Tomcat乱码问题
问题描述:
在前端页面执行查询传递中文到服务器后端获得对应的值,出现乱码
问题排除:
查看到前端页面传递的请求体数据,也是设置了content-type中charset=UTF-8,然后请求后端编码方式没有查明,估计是直接获得了request对应的数据,然后以系统项目编码方式进行解码,查看了系统项目编码方式也是UTF-8,这就可能是tomcat接收到了请求,然后使用其他编码方式进行了编码,然后服务器以UTF-8解码,这里获得的数据还是乱码的。
然后从百度查得知:tomcat在7.0版本的时候默认使用的是ISO-8859-1编码,该编码为单字节编码方式,因此就会导致乱码出现。
问题解决:
在tomcat中conf文件夹下的server.xml下,找到监听的http端口,如默认为8080端口,然后在节点上添加URIEncoding="UTF-8"即可。
< Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />