post json 中文编码问题

帮朋友搞得一段程序,是易语言环境的post,我要传递一串带有中文的JSON给node服务器.字符串如下

{"itemdata":{"nType":"1","nBaoYou":"0","szItemId":"536347062406","title":"秋冬新款女装韩版半高领毛 衣女加厚修身显瘦长袖套头针织衫打底衫","secondTitle":"","imgURL":"http://img4.tbcdn.cn/tfscom/i1/TB1OniJLXXXXXXzXpXXXXXXXXXX_!!0-item_pic.jpg","promotionTxt":"限时秒杀价","fOldPrice":"108","fThirdPrice":"0","fCommissionPer":"10.5","fCommission":"2.08","nTgCount":"0","nSellCount":"37","fPingFen":"0","nPingjiaCount":"5","szTgURL":"","szWebTgURL":"","szBlogTgURL":"","shortUrl":"","szDesc":"","nick":"艾伦圣玛旗舰店","coupon":""}}  

然后,服务器接受到以后显示的是乱码,
clipboard.png

然后用postman 测试发现只有raw json 才能正确发送和接收,
于是我上网查什么是raw ,查到是不进行任何数据编码传送,直接传递数据,
最后我想到,难道是语言环境的文本编码问题?
因为postman 是js 写的,所以Postman 没有语言环境编码的差异,
所以才会正常传送?如果是这样理论上发送的时候把发送环境的编码弄成和js 一样的编码应该也可以呀?
于是我想请问,如何做才能像js 一样只在发送端处理成为正确的json 就可以解决编码问题?
因为如果转码成utf8 的话,服务端还是要再解码一遍.作为一个技术,不想放弃最优方案.所以请问大神如何解决?

clipboard.png

阅读 15.4k
6 个回答

我也有这个问题,不知道楼主解决了没有,过滤器也加了,服务器的配置也写了,还是乱码、、

-----------------------------------华丽的分割线------------------------------

调了一上午我发现我的问题在哪里了

bodyReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
body = bodyReader.readLine();

代码中通过以上方式将请求的内容转换为字符串

没有指定字符集,通过源码看到使用了默认的字符集,sun.nio.cs.StreamDecoder类如下方法

    public static StreamDecoder forInputStreamReader(InputStream var0, Object var1, String var2) throws UnsupportedEncodingException {
        String var3 = var2;
        if(var2 == null) {
            var3 = Charset.defaultCharset().name();
        }

        try {
            if(Charset.isSupported(var3)) {
                return new StreamDecoder(var0, var1, Charset.forName(var3));
            }
        } catch (IllegalCharsetNameException var5) {
            ;
        }

        throw new UnsupportedEncodingException(var3);
    }

然后我本地环境的默认字符集是GBK,然后解码时导致乱码
可以通过设置JVM参数,-Dfile.encoding=UTF-8
强制将默认字符集调整为UTF-8,然后顺利的解决了我的问题

在Http Header中加上Content-Type:"application/json;charset=UTF-8"

这貌似跟Python木有关系咯、 在后端用UTF-8编码就不会有乱码了啊。

如果是要在客户端解决,那就是:服务端什么编码,你客户端发送的时候就用什么编码发送

新手上路,请多包涵

我觉得 post 的内容本身应该就是采用 UTF8 编码过的吧,然后你在服务器上看到中文乱码,我想会不会是你服务器本身就是英文环境,没有中文支持,所以才不支持中文显示。我是这么认为的。

新手上路,请多包涵

可以设置 服务器端 默认的接收编码处理(tomcat配置文件Service.xml):
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题