【问题标题】:Ajax autocompletion lost in character encodingAjax 自动完成在字符编码中丢失
【发布时间】:2011-12-27 15:57:20
【问题描述】:

该方案是 html 表单中的文本输入字段,使用 jQuery.autocomplete 自动完成并获得适当的服务器响应(例如城市名称 json 列表)。整个包运行良好......除了客户端在输入重音字符(éèà..)时没有从服务器返回数据。和很多人一样,看起来我正面临一个字符编码问题,但尽管尝试了很多次(iconvutf8_encodeurldecode...)和读数,但无法弄清楚在哪里以及如何解决它this one 例如。

因此,我需要一些帮助/提示来了解在哪里采取行动(在对 jQuery 自动完成代码进行原型设计之前......?)

编辑:可能也是 jQuery 重音折叠问题,我也会尝试that way


  • 配置:
    服务器:Apache2.2 (debian lenny)
    php : 编译 5.3.3 (所以选项 JSON_UNESCAPED_UNICODE 不适用于json_encode)
    mysql:5.1.49,带有 MySQL 字符集:UTF-8 Unicode (utf8),
    类:使用修改后的PFBC2.x 版本进行php表单构建


  • 该网站主要面向法国用户,因此全部采用 ISO-8859-1 设计(我猜最初的选择很糟糕):

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    
  • jQuery自动补全代码(应用于城市输入框)

    // DEBUG Testing (tested w/ and w/o the $charset_attr: no change)
    $charset_attr = 'contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1"';
    echo 'jQuery("#' . $this->attributes["id"] . '").autocomplete({source:"' , $this->xhr_path . '", minLength:2, ' . $charset_attr .'});';
    

    为该输入字段生成的代码符合上述预期。

  • 使用 this function 将 mysql 行转换为 utf8 :
    在将 json 发送回客户端之前,我将 msyql 返回的数组转换为 utf8。实际上,我还测试并编写了其他函数,但这并没有改变任何东西,所以我想重点不存在。

    $encoded_arr = utf8json($returnData);   
    echo json_encode($encoded_arr);   
    flush();   
    
  • 编码控制 1(客户端)
    在 html 表单中嵌入控件,以检查实际传递给 jQuery.autocomplete 的字符编码:

    jQuery(document).ready(function() {   
    <?php   
    $test_str ="foobar";
    $check_encoding = "'" . mb_detect_encoding($test_str) . "'";
    ?>
    alert('Check charset server encoding: ' + <?php echo $check_encoding;?> ); // output : ASCII
    });
    
  • 编码控制2(服务器端)

    $inputData = (isset($_GET))? htmlspecialchars($_GET['term'],ENT_COMPAT, 'UTF-8') : NULL;   
    $encoding_get = mb_detect_encoding($_GET['term']);   
    $encoding_data = mb_detect_encoding($inputData);   
    $utf8converted = @iconv(strtolower($encoding_get), 'utf-8', $inputData);   
    $checkconversion = mb_detect_encoding($utf8converted);   
    

    发送小写普通字符(ea..),我得到的都是 ASCII
    发送小写重音字符 (éèà..),我得到的都是 UTF8

所以我迷路了,因为服务器接收到正确的 char 字符串,产生了一个 json 返回(在没有 ajax 的情况下测试),但看起来客户端没有正确接收或解释这个。

【问题讨论】:

    标签: php jquery character-encoding autocomplete


    【解决方案1】:

    对于那些面临同样...%$@ 问题的人,这是我为解决我的问题所做的工作:

    • 检查每个节点(例如客户端、apache服务器、mysql服务器)的char编码,在服务器端使用mb_detect_encoding

    • 最后指出问题位置节点:在我的情况下,将 UTF8 字符传递给 mysql 服务器 i/o latin ISO-8859-1,因此 mysql 服务器没有返回预期的答案,我无法检测或使用直接 url 将数据发布到服务器脚本进行调试。所以我将输入和输出记录在一个文件中,检查条目字符编码和mysql服务器输出。

    • 将 ajax 请求更改为 POST i/o GET,

    • 通过在发送 mysql 服务器请求之前将 $_POST 数据编码到 ISO 来解决,使用 mb_convert_encoding,以及描述 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多