如何使用法语口音对数组进行 json_encode?
Posted
技术标签:
【中文标题】如何使用法语口音对数组进行 json_encode?【英文标题】:How to json_encode array with french accents? 【发布时间】:2011-10-19 05:30:16 【问题描述】:我有一个带有法国口音的数组项([WIPDescription] => Recette Soupe à lOignon Sans Boeuf US)。数据正在从数据库(mysql)中正确提取。
但是,当我尝试使用 json_encode 内置的 php 将其编码为 json 时,它会产生一个空 json 值(OS X 服务器:php 5.3.4,启用 json 1.2.1)。
在 Linux 服务器中,描述在第一个重音字符之后被截断。
我尝试了所有 json_encode 选项,但没有成功。有什么建议吗?
谢谢。
【问题讨论】:
【参考方案1】:如果您处理变音符号,您还可以添加 JSON_PARTIAL_OUTPUT_ON_ERROR,它只会删除问题并保持其余部分不变。在我发现这个之前我使用了 utf_encode ,但它弄乱了变音符号。
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR);
【讨论】:
【参考方案2】:$json = utf8_encode($string);
$json = json_decode($json);
【讨论】:
【参考方案3】:json_encode
只想要utf-8
。根据您的字符集,您可以使用 iconv
或 utf8_encode
before 在您的变量上调用 json_encode
。可能是array_walk_recursive
。
根据要求,一种更改数组的未完成方法,假设 (1) 它不包含对象,并且 (2) 数组键在 ascii / 下限中,所以可以保持原样:
$current_charset = 'ISO-8859-15';//or what it is now
array_walk_recursive($array,function(&$value) use ($current_charset)
$value = iconv('UTF-8//TRANSLIT',$current_charset,$value);
);
【讨论】:
array_walk_recursive 需要用户定义的函数。你会建议他制作一个在每个值上都调用 utf8_encode 的方法吗?如果是这样,这将如何影响实际的数组值——它们会被返回还是通过引用传递?这听起来是个好主意,但我无法将它放在我的脑海中。 @Matt Anderson:好的,就这一次......我将编辑一个不适用于对象但适用于数组的示例,并假设键是 ascii (=valid在 ascii/ISO-8859-*/utf-8)。 数据库排序规则和字符集设置为utf8_unicode_ci。如何确定mysql返回数组的字符集? 谢谢。当我使用 mysql_query("SET NAMES 'utf8'", $Connection);它工作正常。 (我确实意识到我必须使用 mysql_set_character_set() 函数才能正确执行此操作。) @Natkeeran:确实,也可以,而且我总是使用查询变体(尤其是在 PDO 中),我看不出为什么mysql_set_charset
会更好。当然,手册确实说明了这一点,但我还没有找到原因。【参考方案4】:
我发现这是处理它的最简单方法
echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
JSON_PRETTY_PRINT - 可读 JSON_UNESCAPED_UNICODE - 正确编码字符 JSON_UNESCAPED_SLASHES - 去掉转义斜线 '\' 另请注意,这些选项由管道'|'分隔
【讨论】:
正是我需要的! JSON_UNESCAPED_UNICODE 是从数据库中检索 utf-8 字符串时使用的选项;它解决了我在尝试编码时只用“?”替换特殊字符时的问题。 你是我的英雄! :D【参考方案5】:另一种解决方案是在使用json_encode
传递编码字符之前使用htmlentities
或utf8_encode
像这样:
$array = array('myvalue' => utf8_encode('ééàà'));
return json_encode($array);
或者使用htmlentities
:
$array = array('myvalue' => htmlentities('ééàà'));
return json_encode($array);
【讨论】:
而在浏览器中如何解码回utf8? @Inanikian 使用 PHPheader('Content-Type: text/html; charset=utf-8');
和 HTML <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
我试过header('Content-Type:application/json; charset=utf-8')
但仍然有代码u/...所以我决定删除法语单词à
...
这解决了我的 json_encoding 字符串问题。谢谢!【参考方案6】:
<?
$sql=mysql_query("SELECT * FROM TABLE...");
while($row=mysql_fetch_array($sql))
$output[]=array_map("utf8_encode", $row);
print(json_encode($output));
mysql_close();
?>
【讨论】:
【参考方案7】:根据PHP docs
此函数仅适用于 UTF-8 编码的数据。
【讨论】:
以上是关于如何使用法语口音对数组进行 json_encode?的主要内容,如果未能解决你的问题,请参考以下文章
当消息中有法语口音时,我的邮件功能返回成功并且未收到邮件[重复]