如何使用法语口音对数组进行 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。根据您的字符集,您可以使用 iconvutf8_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 传递编码字符之前使用htmlentitiesutf8_encode

像这样:

   $array = array('myvalue' => utf8_encode('ééàà'));
   return json_encode($array);

或者使用htmlentities

   $array = array('myvalue' => htmlentities('ééàà'));
   return json_encode($array);

【讨论】:

而在浏览器中如何解码回utf8? @Inanikian 使用 PHP header('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?的主要内容,如果未能解决你的问题,请参考以下文章

使用法语口音时语法无效

当消息中有法语口音时,我的邮件功能返回成功并且未收到邮件[重复]

对数组内容使用了json_encode返回汉字内容返回了空值

空 json_encode

json_encode 函数:特殊字符

如何控制 json_encode 行为?