在做银行支付接口案例的时候,遇到的编码问题!

    之前遇到的在加密运算的时候,传输涉及到字符,但是因为转化,其中还是有部分加密码是由汉字转化来的,但是传输中出现了问题,发现不应该用字符传输,而是应该转化成字节流再进行传输,其中就是因为ISO8859-1和UTF-8的原因;

我传递之后发现长度变长了!!!

发现,应该在传输时,杜绝字符,使用字节最为合适,特别是因为我们使用的Tomcat容器,其底层是ISO8859-1的单字节编码,而我们中文环境下使用的是UTF-8的多字节编码;

所以当我把加密后的字符内容放到jsp中的hidden  input内时,发现首尾都多出了几个空格?并且长度在trim了空格,之后依旧变长了;


同时也复习一个问题:


在servlet中获取用户参数数据:
request.getParameter("参数名")遇到参数中出现中文乱码的时候;


POST提交:
request.setCharacterEncoding("utf-8");
get提交:
手动解码:

name = new String(name.getBytes("ISO-8859-1"), "utf-8");  // 测试setCharacterEncoding同样可以

Tomcat默认的编码是ISO8859-1,但是我们此项目使用的是UTF8,所以接收的时候会出现乱码;

因为在ISO8859-1,和UTF8等等编码中英文和数字,都是单字节编码,上面讲了:所以英文和数字

不会出现乱码,但是中文就很惨了;

所以我们要将得到的乱码进行ISO-8859-1进行解码,转化为字符流,再重新通过utf-8进行转化!

(因为我们在进行get方式提交之前,就是utf-8的编码,但是Tomcat又通过了ISO8859-1进行编码)


而我在做文件下载(下载一张图片的案例的时候):

File file = new File("e:/图片.png");// 中文的图片名的话,必须这样进行包装     先通过GBK进行getBytes,然后通过设置新的ISO8859_1
response.setHeader("content-disposition","attachment;filename="+new String(file.getName().getBytes("GBK"),"ISO8859_1"));

又是先通过GBK得到字符流,然后再通过ISO8859-1进行编码了呢?

因为我们是在Tomcat容器中进行下载,最近进行译码操作的也是Tomcat容器,所以使用ISO8859-1进行编码;

那为什么通过GBK进行获取流呢?我们不是工作空间为UTF-8吗?因为我们当前是在Windows环境下,Windows环境下

默认的是gb2312,然而gb2312属于GBK组。


究其原理:不管是什么字符,传输都要进行编码和解码,通过一种编码格式进行编码后,就要通过对应的方式进行解码(getBytes),在转化为中间状态,字节流的时候,就可以通过任何一种编码格式进行编码了,同上的new String,指定一种编码进行重新构造!


我们要了解在http协议中POST和GET两个命令的区别(参照百度):

1.get是从服务器上获取数据,post是向服务器传输数据;(这个暂时没有什么感触)

2.get是把参数数据加到URL中,值和表单一一对应在URL中可以看到;post通过HTTP post机制,

   把各个字段和 HTML HEADER一起传送,用户看不到!

3.get用于URL传值,post用于form传值。

4.get传输的数据量小,不能大于2KB。post传输大,大家都讲大小没有限制,其实理论上讲还是有限制的但是大到足够传输

5.最后就是大家都知道的,POST安全性高,GET安全性低。但是安全性低的往往执行效率会高一些GET就是如此。(Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post)


Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。ISO向下兼容ASCII。


原文地址:https://www.cnblogs.com/mzywucai/p/11053506.html