Php Ajax自动完成在字符编码中丢失
scheme是一个html表单中的文本输入字段,将使用并获得适当的服务器响应(例如,城市名称json列表)自动完成。整个程序运行良好。。。但客户端在键入重音字符(èè..)时不会从服务器返回数据。和许多人一样,看起来我面临着一个字符编码问题,但尽管我做了很多尝试(,…)和阅读了很多类似的内容,但还是无法找到解决问题的方法 因此,我需要一些帮助/提示来理解在何处采取行动(在原型化jQuery自动完成代码之前…?) 编辑:可能也是jQuery重音折叠的问题,我也会试试Php Ajax自动完成在字符编码中丢失,php,jquery,character-encoding,autocomplete,Php,Jquery,Character Encoding,Autocomplete,scheme是一个html表单中的文本输入字段,将使用并获得适当的服务器响应(例如,城市名称json列表)自动完成。整个程序运行良好。。。但客户端在键入重音字符(èè..)时不会从服务器返回数据。和许多人一样,看起来我面临着一个字符编码问题,但尽管我做了很多尝试(,…)和阅读了很多类似的内容,但还是无法找到解决问题的方法 因此,我需要一些帮助/提示来理解在何处采取行动(在原型化jQuery自动完成代码之前…?) 编辑:可能也是jQuery重音折叠的问题,我也会试试 配置: 服务器:Apach
- 配置:
服务器:Apache2.2(debian lenny)
php:compiled 5.3.3(因此JSON_UNESCAPED_UNICODE选项不适用于)
mysql:5.1.49和mysql字符集:UTF-8 Unicode(utf8),
类:使用php表单构建的修改版本 - 元
该网站主要面向法国用户,因此其设计全部采用ISO-8859-1(我猜这是一个糟糕的初始选择): 为该输入字段生成的代码与上述预期匹配 - 使用以下命令将mysql行转换为utf8:
在将json发送回客户端之前,我将msyql返回的数组转换为utf8。事实上,我还测试并编写了其他函数,但这并没有改变任何东西,所以我想关键不在这里$encoded_arr = utf8json($returnData); echo json_encode($encoded_arr); flush();
- 编码控制1(客户端)
html表单中的嵌入控件,用于检查实际传递给以下对象的字符编码: 发送小写普通字符(ea..),我得到的所有字符都是ASCII
发送小写重音字符(èè..),我得到的所有字符都是UTF8
因此,当服务器接收到正确的字符字符串,生成json返回(在没有ajax的情况下进行测试)时,我就不知所措了,但客户端似乎没有正确地接收或解释这个问题。对于那些面临相同类型的…%$@问题的人,下面是我为解决我的问题所做的:
- 在服务器端使用检查每个节点(例如客户端、apache服务器、mysql服务器)上的字符编码
- 最后指出了位置节点的问题:在我的例子中,将UTF8字符传递给mysql服务器i/o latin ISO-8859-1,因此mysql服务器没有返回预期的答案,我无法通过直接向服务器脚本发送url数据进行检测或调试。因此,我将输入和输出记录在一个文件中,检查条目字符编码和mysql服务器输出
- 将ajax请求更改为POST i/o GET
- 通过在发送mysql服务器请求之前将$\u POST数据编码到ISO来解决此问题,如所述
// 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 .'});';
$encoded_arr = utf8json($returnData);
echo json_encode($encoded_arr);
flush();
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
});
$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);