该方案是html表单中的文本输入字段,使用jQuery.autocomplete自动完成并获取相应的服务器响应(例如,城市名称json列表)。整个包运行良好...除了客户端在键入重音字符(éèà..)时没有从服务器返回数据。与许多人一样,看起来我正面临着一个字符编码问题,但无论多次尝试(iconv,utf8_encode,urldecode,我都无法弄清楚在哪里以及如何解决它。 ..)和像this one这样的读数。
因此,我需要一些帮助/提示来了解在哪里采取行动(在jQuery自动完成代码原型设计之前......?)
编辑:也可能是jQuery重音折叠问题,我也会尝试that way。配置:
服务器:Apache2.2(debian lenny)
php:编译5.3.3(因此选项JSON_UNESCAPED_UNICODE不适用于json_encode)
mysql:5.1.49 with MySQL charset:UTF-8 Unicode(utf8),
class:使用修改后的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的char编码:
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测试),但看起来客户端没有正确接收或插入它。
答案 0 :(得分:0)
对于那些面临同样......%$ @问题的人来说,这就是我为解决我的问题所采取的措施:
使用服务器端的mb_detect_encoding检查每个节点(例如客户端,apache服务器,mysql服务器)的字符编码,
最后指出问题定位节点:在我的情况下将UTF8字符传递给mysql服务器i / o latin ISO-8859-1,所以mysql服务器没有返回预期的答案,我无法检测到或使用直接url调试将数据POST到服务器脚本。所以我将输入和输出记录在一个文件中,检查条目字符编码和mysql服务器输出。
将ajax请求更改为POST i / o GET,
通过使用mb_convert_encoding发送mysql服务器请求之前将$ _POST数据编码到ISO解决,以及here描述。