一个很奇怪的 AJAX GET 导致的乱码问题. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Actrace
V2EX    PHP

一个很奇怪的 AJAX GET 导致的乱码问题.

  •  
  •   Actrace 2014-07-04 16:12:28 +08:00 4531 次点击
    这是一个创建于 4129 天前的主题,其中的信息可能已经有所发展或是发生改变。
    windows系统,chrome+firefox.
    页面里通过AJAX GET发送更新数据的请求到API接口.
    更新后的中文数据存入数据库后会乱码.
    通过Network抓包,然后把GET的URL用新标签页打开.
    数据就正常更新了.

    windows系统,IE浏览器,一切正常.

    更诡异的是我用Mac上的safari,chrome,firefox去测试,所有功能都正常.

    前后端的编码都是统一用的UTF-8.

    有大神帮忙看看么.
    14 条回复    2014-07-05 18:22:39 +08:00
    icanfork
        1
    icanfork  
       2014-07-04 16:16:05 +08:00
    urlencode & urldecode ?
    sampeng
        2
    sampeng  
       2014-07-04 16:31:32 +08:00
    编码问题。毫无疑问。。。你编码是utf-8。
    但是传输不一定是。ajax也可以设置编码格式吧。不记得了。。另外。。你到底是ajax还是jsonp。。。后者可能会出现这个情况。
    总有一个地方是编码不对的。
    Actrace
        3
    Actrace  
    OP
       2014-07-04 16:49:39 +08:00
    @sampeng 我在出现问题的chrome上抓包,然后在后端里打印出用于update的语句,语句是完全没问题的.我勒个去.但是数据库里的数据就是有问题.
    kmvan
        4
    kmvan  
       2014-07-04 17:04:26 +08:00 via Android
    不同统一
    skydiver
        5
    skydiver  
       2014-07-04 17:05:54 +08:00
    输出的时候加header Content-Type: application/json
    skydiver
        6
    skydiver  
       2014-07-04 17:06:16 +08:00
    @skydiver 没写全

    输出的时候加header Content-Type: application/json, charset=utf8
    skydiver
        7
    skydiver  
       2014-07-04 17:07:05 +08:00
    @skydiver 我去。。又写错。。Content-Type: application/json; charset=utf8
    zhangsan
        8
    zhangsan  
       2014-07-04 17:07:55 +08:00
    ajax get 的时候 encodeURIComponent 下 中文字符的参数,然后服务端接收的时候 urldecord 下
    Actrace
        9
    Actrace  
    OP
       2014-07-04 17:22:26 +08:00
    @skydiver
    @kmvan
    @zhangsan

    我来补充一下,传值,编码,完全正常.而且抓包打印回来的SQL语句复制出来放数据库里执行也是没问题的.
    甚至我Mac上的所有浏览器,Windows上的IE浏览器都能正常使用所有功能,唯独firefox,chrome发起的AJAX GET请求,会导致数据库更新操作的内容乱码,但是新开标签页去发送这个GET请求(完全一样),就不会乱码.
    sampeng
        10
    sampeng  
       2014-07-04 17:39:59 +08:00
    @Actrace
    抓包打印。。你是如何抓包打印?输出页面?输出到html上?那你还是在这个环境里。。你把sql输出到文件里面试试= =!就知道编码对不对了。。

    get的编码不是utf-8.。。。。
    ie和chrome/firefox的get编码也不一样~所以才要求对中文进行urlencode。。
    别直接传递中文。。请urlencode。到那边了再解开。。这是一般的做法。也就不会有问题
    zhangsan
        11
    zhangsan  
       2014-07-04 21:17:57 +08:00
    @Actrace 你还是听大家的,get的时候 把参数encodeURIComponent 下,试试。

    windows上 chrome 跟 firefox 都是自动对 url 编码的。
    Actrace
        12
    Actrace  
    OP
       2014-07-05 12:15:41 +08:00
    @zhangsan 多谢各位支招,我现在在尝试。

    @sampeng 直接打印到日志确实发现一些奇怪的问题。有一些包含中文的GET请求在后端打印出SQL语句,如果该GET请求正常日志里面有中文字符也能正常显示,不过有一定几率异常,这个时候写入日志后就会异常,连同以前能正常显示中文字符的语句也跟着变乱码了。
    caofugui
        13
    caofugui  
       2014-07-05 18:19:15 +08:00
    先把中文加密,入库的时候再解密不就完了。
    Actrace
        14
    Actrace  
    OP
       2014-07-05 18:22:39 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:58 PVG 01:58 LAX 10:58 JFK 13:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86