我正在使用Google Places API为我的应用程序提供下拉菜单中的城市,国家/地区等列表。我对包含此代码的文件使用AJAX请求:
$results = file_get_contents("https://maps.googleapis.com/maps/api/place/autocomplete/json?types=(regions)&language=EN&offset=4&key=" . $key . "&input=" . $input);
$decode = json_decode($results, true);
foreach($decode["predictions"] as $value){
$json_array[] = $value["description"];
}
echo json_encode($json_array);
在这方面似乎一切正常,但是当JSON返回到AJAX应用程序时,某些字符显示不正确。例如,当我尝试显示结果时,“圣保罗”中的“ã”显示为“,,”或“S ,, o Paulo”。如果我提醒结果,字符会在弹出窗口中正确显示 - 所以当我将结果提供给javascript以显示在下拉列表中时,我似乎错过了一些东西。 (令人恼火的是,当用户从下拉列表中选择时,错误编码的结果最终会进入我的数据库。)
我尝试使用“utf8_encode()”编码每个字符串,然后将其添加到“$ json_array”(当然是在PHP文件中),但这只会使事情变得复杂 - 看起来结果是双重的 - 最终在javascript中显示时编码或其他内容。
另外,我应该注意网页在元标记中有UTF-8字符集。
作为后续行动:
我创建了一个简单的HTML页面,其中我在div中显示“ã”,它确实显示正确。我还使用jQuery在页面加载的另一个div中显示相同的字符,这也显示正确。我甚至不需要在该页面上设置编码。所以我只能假设,因为这个测试页面是纯粹的普通HTML,问题来自我的PHP设置。
我已将以下内容添加到另一个PHP测试页面的开头:
mb_internal_encoding("UTF-8");
mb_http_output("UTF-8");
mb_http_input("UTF-8");
mb_language("uni");
mb_regex_encoding("UTF-8");
ob_start("mb_output_handler");
header("Content-Type: text/html; charset=UTF-8");
但我仍然看到错误显示的字符。所以到目前为止我添加了上面的内容,在php.ini中将default_encoding更新为UTF-8,并检查了meta标签是否指定了UTF-8。这真的开始让我烦恼了!
答案 0 :(得分:0)
使用其中一个标题:
header('Content-type: application/json');
header('Content-Type: text/html; charset=UTF-8);
在阿拉伯语的情况下,为我工作。
答案 1 :(得分:0)
可能是网页无法识别该字符。要解决此问题,请为此角色使用HTML代码。
例如,ã
的HTML代码为ã
。
您可以在here找到更多相关信息。
$mystring = 'São Paulo';
$findme = 'ã';
$pos = strpos($mystring, $findme);
if ($pos != false) $findme = "ã";
答案 2 :(得分:0)
这是最蠢的事情......但我在这个过程中学到了很多关于字符编码的知识。事实证明(我根本没有提到这一点,因为它似乎并不相关),Bootstrap中的Helvetica字体无法显示这些特殊字符。是的,wtf?我将每个可能的编码选项设置为“UTF-8”,并且一直以来只是愚蠢的CSS字体选择。所以最后我把字体系列改为“Arial”,问题就解决了。
感谢大家的意见。