java http post 乱码_web 实战-10-HTTP post 请求中文乱码

场景

页面 form 表单,post 提交。

然后 jsp 去接受,结果发现中文乱码。

解决方案

尝试1

设置 request 接受编码

request.setCharacterEncoding("utf-8");

发现没有效果

尝试2

去乱码的部分尝试解码:

value = java.net.URLDecoder.decode(value,"UTF-8");

发现依然无效。

尝试3

直接从 ISO-8859-1 转为 utf-8,测试有效

value = new String(value.getBytes("ISO-8859-1"),"UTF-8");

中文乱码问题

http 响应乱码

BufferedReader reader = new BufferedReader(new InputStreamReader(

conn.getInputStream(), "UTF-8"));

这样指定之后,获取可以保证接受的中文不再乱码。

页面提交,后端接受乱码

mvc 项目接受其他的信息不乱码,猜测还是请求的参数有问题导致的。

尝试下对中文进行编码。

输入流调整:

//输入流

//OutputStream os = conn.getOutputStream();

OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");

我是尝试了一下获取字节流的时候指定编码:

// 普通字段

if (textMap != null) {

StringBuilder strBuf = new StringBuilder();

for(Map.Entry entry : textMap.entrySet()) {

String inputName = entry.getKey();

String inputValue = entry.getValue();

if (inputValue == null) {

continue;

}

strBuf.append("\r\n")

.append("--")

.append(BOUNDARY)

.append("\r\n");

strBuf.append("Content-Disposition: form-data; name=\"").append(inputName).append("\"\r\n\r\n").append(inputValue);

}

// 指定编码

out.write(strBuf.toString().getBytes("UTF-8"));

}

发现依然没有效果。

传参前进行转码

最后,在网上看到一篇文章后,看了一种建议方式,并且是可行的,就是使用URLEncode,将中文参数在传参前进行encode。

这里以UTF-8编码是为了在服务器端接收参数后无需再转码了,如下:

URLEncoder.encode(name, "GBK")

通用解决方案

通用

1.通用的方法:

new String(参数.getBytes(“iso-8859-1”),”utf-8”);

POST

2.针对于post请求来说:只需要将请求流的编码设置成utf-8即可

request.setCharacterEncoding("utf-8");

个人尝试

个人的场景比较麻烦。

post 参数有中文,而且还有文件信息。文件的编码还是 GBK 格式。

本来想使用 OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");,发现会导致文件编码错乱。

于是决定前后端配合。

小测试

String text = "中文乱码";

String encode = URLEncoder.encode(text, "UTF-8");

System.out.println(encode);

String decode = URLDecoder.decode(encode, "UTF-8");

System.out.println(decode);

日志如下:

%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81

中文乱码

解决思路

前端编码

后端解码

前端编码

// 文件名中文乱码问题(解析之后,页面正常)ios=>utf8

value = new String(value.getBytes("ISO-8859-1"),"UTF-8");

// 编码,防止传输问题

value = URLEncoder.encode(value, "UTF-8");

后端代码

private void decodeFileName(Req req) {

try {

String oldFileName = req.getFileName();

if(StringUtils.isEmpty(oldFileName)) {

return;

}

// 解码为 UTF-8

String fileName = URLDecoder.decode(oldFileName, "UTF-8");

log.info("解码后的文件名:{}", fileName);

req.setFileName(fileName);

} catch (UnsupportedEncodingException e) {

log.error("文件名称解码失败:{}" + req, e);

}

}

测试成功。

总结:方法总比困难多,奈何困难特别多。

参考资料

[Java

POST请求,响应中文乱码处理](https://blog.csdn.net/u012294515/article/details/84617140)

中文乱码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值