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