restTemplate 中文乱码

2021-01-13 09:25:00 +08:00
 sandman511


URL 是个短信接口,alarmMsgInfo 是短信的内容拼接在 URL 上
比如拼:你好, 短信发的是:浣犲ソ
这是说明编码用的 utf8 解析用的 gbk ?

1805 次点击
所在节点    程序员
11 条回复
wangsongyan
2021-01-13 09:28:06 +08:00
短信发出去乱码?仔细看下短信接口文档
wangyanrui
2021-01-13 09:32:46 +08:00
看一下 StringHttpMessageConverter 源码
记得默认的编码是 IOS 8859-1
springmarker
2021-01-13 09:34:36 +08:00
get 方法发短信?
xuwei0056
2021-01-13 09:42:02 +08:00
先 urlEncode ?
90d0n
2021-01-13 09:46:11 +08:00
```
List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) {
if ( httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(StandardCharsets.UTF_8);
break;
}
}
```

替换一下 converter 试试?
sandman511
2021-01-13 10:31:56 +08:00
@xuwei0056 这个试过了 还是不行
chendy
2021-01-13 10:35:49 +08:00
拼接在 url 上的中文要 urlEncode
用 UrlEncoder.encode(msg, "GBK")
sandman511
2021-01-13 10:38:17 +08:00
@chendy
@xuwei0056
URLEncoder 之后 短信 发的是 %C4%E3%BA%C3
sandman511
2021-01-13 10:50:24 +08:00
@xuwei0056
@chendy
使用 HttpClient PostMethod 配合 URLEncoder 是可以成功发送中文的:
HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = httpConnectionManager.getParams();
params.setConnectionTimeout(5000);
params.setSoTimeout(20000);
params.setDefaultMaxConnectionsPerHost(1000);
params.setMaxTotalConnections(1000);
client = new HttpClient( httpConnectionManager);
PostMethod post = new PostMethod(URL + URLEncoder.encode(alarmMsgInfo, "GBK"));
client.executeMethod(post);

但是用 restTemplate 就不行 发的是 %C4%E3%BA%C3
chendy
2021-01-13 10:54:42 +08:00
@sandman511 忘记了,直接放 url 字符串会多一次 urlEnocded,暴力方法是下面这样自己 encode url (优雅方法是自定以 UriHandler,有点麻烦……):

RestTemplate rt = new RestTemplateBuilder().build();
UriComponentsBuilder uri = UriComponentsBuilder.fromUriString("http://localhost:8080/test");
uri.queryParam("x", "中文");
uri.encode(Charset.forName("GBK"));

System.out.println(uri.toUriString());

Map s = rt.getForObject(uri.build().toUri(), Map.class);
System.out.println(s);
sandman511
2021-01-13 11:32:59 +08:00
@chendy 可以了!感谢帮助!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744411

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX