V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sandman511
V2EX  ›  程序员

restTemplate 中文乱码

  •  
  •   sandman511 · 2021-01-13 09:25:00 +08:00 · 2004 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2021-01-13 11:32:59 +08:00
    wangsongyan
        1
    wangsongyan  
       2021-01-13 09:28:06 +08:00
    短信发出去乱码?仔细看下短信接口文档
    wangyanrui
        2
    wangyanrui  
       2021-01-13 09:32:46 +08:00
    看一下 StringHttpMessageConverter 源码
    记得默认的编码是 IOS 8859-1
    springmarker
        3
    springmarker  
       2021-01-13 09:34:36 +08:00
    get 方法发短信?
    xuwei0056
        4
    xuwei0056  
       2021-01-13 09:42:02 +08:00
    先 urlEncode ?
    90d0n
        5
    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
        6
    sandman511  
    OP
       2021-01-13 10:31:56 +08:00
    @xuwei0056 这个试过了 还是不行
    chendy
        7
    chendy  
       2021-01-13 10:35:49 +08:00
    拼接在 url 上的中文要 urlEncode
    用 UrlEncoder.encode(msg, "GBK")
    sandman511
        8
    sandman511  
    OP
       2021-01-13 10:38:17 +08:00
    @chendy
    @xuwei0056
    URLEncoder 之后 短信 发的是 %C4%E3%BA%C3
    sandman511
        9
    sandman511  
    OP
       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
        10
    chendy  
       2021-01-13 10:54:42 +08:00   ❤️ 1
    @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
        11
    sandman511  
    OP
       2021-01-13 11:32:59 +08:00
    @chendy 可以了!感谢帮助!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3576 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:40 · PVG 12:40 · LAX 20:40 · JFK 23:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.