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

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

  •  
  •   Actrace · 2014-07-04 16:12:28 +08:00 · 4212 次点击
    这是一个创建于 3821 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    belin520
        1
    belin520  
       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   ·   实用小工具   ·   3049 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:54 · PVG 21:54 · LAX 05:54 · JFK 08:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.