记录乱码问题

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的编码方式。

问题:

  1. 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

开发中乱码问题整理_编码方式_02

再运行相同的代码得到如下输出

发货顺丰多久啊司法局大家放松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();
        };