记录乱码问题
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();
};