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

restTemplate 中文乱码

  •  
  •   sandman511 · 6 天前 · 822 次点击

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

    11 条回复    2021-01-13 11:32:59 +08:00
    wangsongyan
        1
    wangsongyan   6 天前
    短信发出去乱码?仔细看下短信接口文档
    wangyanrui
        2
    wangyanrui   6 天前
    看一下 StringHttpMessageConverter 源码
    记得默认的编码是 IOS 8859-1
    springmarker
        3
    springmarker   6 天前
    get 方法发短信?
    xuwei0056
        4
    xuwei0056   6 天前
    先 urlEncode ?
    90d0n
        5
    90d0n   6 天前
    ```
    List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> httpMessageConverter : list) {
    if ( httpMessageConverter instanceof StringHttpMessageConverter) {
    ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(StandardCharsets.UTF_8);
    break;
    }
    }
    ```

    替换一下 converter 试试?
    sandman511
        6
    sandman511   6 天前
    @xuwei0056 这个试过了 还是不行
    chendy
        7
    chendy   6 天前
    拼接在 url 上的中文要 urlEncode
    用 UrlEncoder.encode(msg, "GBK")
    sandman511
        8
    sandman511   6 天前
    @chendy
    @xuwei0056
    URLEncoder 之后 短信 发的是 %C4%E3%BA%C3
    sandman511
        9
    sandman511   6 天前
    @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   6 天前   ❤️ 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   6 天前
    @chendy 可以了!感谢帮助!
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3781 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 04:52 · PVG 12:52 · LAX 20:52 · JFK 23:52
    ♥ Do have faith in what you're doing.