2011-12-27 66 views
0

该方案是一个html格式的文本输入字段,使用jQuery.autocomplete自动完成并获取相应的服务器响应(例如,城市名称json列表)。整个程序包运行良好...除了客户端在输入重音字符(éàà..)时没有从服务器返回数据。与许多人一样,它看起来像我正面临一个字符编码问题,但无法设法找出哪里以及如何解决它,尽管尝试了很多次(iconv,utf8_encode,urldecode ...)和读数,例如this oneAjax自动完成在字符编码中丢失

所以我需要一些帮助/提示来了解在哪里行事

EDIT(原型jQuery的自动完成代码之前...?):可能也有jQuery的口音折叠的问题,我也试着that way


  • 配置:
    服务器:APACHE2.2(Debian的莱尼)
    PHP:编译5.3.3(所以选择JSON_UNESCAPED_UNICODE不适用于json_encode
    MySQL的:49年5月1日与MySQL的字符集:UTF-8的Unicode(UTF-8),
    类:使用修改的版本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 .'});'; 
    

    该输入字段的生成代码与上述期望相匹配。

  • 转换MySQL的行插入UTF8使用this function
    我的msyql返回的数组转换成UTF8发送JSON回客户端之前。其实我测试过,也写了其他功能,但是这并没有改变任何东西,所以我猜这个问题不在那里。

    $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

所以我失去了当服务器接受到正确的字符的字符串,产生一个JSON回报(没有Ajax测试),但它看起来像客户端不接收或正确interprate这一点。

回答

0

对于那些面临着同样的那种...%$ @问题,这里是我做了什么来解决我的情况:

  • 检查每个节点的字符编码(如客户,阿帕奇服务器,mysql服务器),使用mb_detect_encoding在服务器端,

  • 最后指出了问题位置节点:在我的情况下传递UTF8字符到MySQL服务器I/O拉丁ISO-8859-1,所以MySQL服务器不会返回预期的答案,我无法使用直接url将数据发布到服务器脚本来检测或调试。所以我将输入和输出记录在文件中,检查输入字符编码和mysql服务器输出。

  • 改变了Ajax请求POST的i/o GET,

  • 解决由$ _POST数据进行编码以ISO之前发送所述MySQL服务器请求,使用mb_convert_encoding,以及描述here