小编在近期遇到了一个乱码的问题,从此认识到了服务器charset这个一个东东,在这里和大家分享下~
在浏览器一个页面右键→编码的子菜单中,都会展示页面的默认编码

那么这个默认编码是怎么选择的呢?
抓包看了下,原来是服务器返回的header中携带的。

那么服务端在哪里来定义返回给客户端的charset呢?
在nginx的server段中,有可以用来定义charset的地方:

可以看到,这个server中,定义了全局的charset为gb2312,在某个location中,又定义了局部的charset为utf-8.这样定义的结果是:对于服务器返回的内容中,对于指定charset的location接口,返回指定的charset,对于没有指定charset的location接口,返回全局的charset。这两种情况都是不受客户端发送的charset的影响的
那么,除了这几种情况,charset的返回还有以下这几种情况。
1、 对于没有指定charset的服务器,返回的charset默认和客户端请求中携带的charset一致。
2、 对于客户端没有指定的charset的请求,服务端默认返回utf-8的charset。
3、 对于client→serverA→serverB这样的请求逻辑。
-
a) 如果client指定了charset为GBK,serverB如果没有指定默认charset,则默认返回GBK。到达serverA的时候,如果serverA指定了charset为utf-8,则最终client收到的请求的charset为utf-8。
-
b) 如果client指定了charset为GBK,serverB如果指定charset为gb2312,则返回gb2312。即使到达serverA的时候,如果serverA指定了charset为utf-8,则最终client收到的请求的charset为gb2312。
所以,当服务端编码和client编码不一致时,或者服务端编码和本身文字编码不一致时,客户端就会展示乱码!改进看看你遇到的问题解决了没?