PHP中使用json_encode时遇到德语umlauts的问题

17

我在处理包含德语umlauts的数据库数据时遇到了问题。基本上,每当我收到包含umlauts的数据时,它就是一个带有问号的黑色方块。我通过使用以下代码解决了这个问题:

mysql_query ('SET NAMES utf8')

查询之前。

问题是,一旦我在查询结果上使用json_encode(...),包含变音符号的值就会变成null。通过在浏览器中直接调用php文件,我可以看到这一点。除了在编码为JSON之前替换这些字符并在JS中解码它之外,是否有其他解决方案?

5个回答

41

看看这里提到的相当优雅的解决方案:here

json_encode( $json_full, JSON_UNESCAPED_UNICODE );

如果您的代码中没有其他问题,那么这应该可以解决它。

编辑:乌劳特问题可能是由多种来源引起的,如HTML文档的字符集、数据库格式或一些先前运行字符串的PHP函数(在处理乌劳特时,您应该绝对研究多字节函数)。这些问题往往非常令人困扰,因为在大多数情况下很难追踪(虽然这不像几年前那样糟糕)。上面的函数解决了使用json_encode时的乌劳特问题...但存在一个问题,即问题可能是由您的应用程序的不同部分引起的,而不是这个特定的函数。


1
这应该是正确的答案。节省了很多时间,谢谢。 - atx
虽然被接受的答案存在许多问题,但这个答案对我有用。 - mdikici

15

我知道这可能有点老了,但这里有一个更好的解决方案:

使用utf-8字符集定义文档类型:

<?php header('Content-Type: application/json; charset=utf-8'); ?>

确保所有内容都是utf_encoded的。JSON只能使用utf-8!

function encode_items(&$item, $key)
{
    $item = utf8_encode($item);
}
array_walk_recursive($rows, 'encode_items');

希望这可以帮助到有需要的人。


6

您可能只是想在浏览器中以某种方式展示文本,因此一种选择是使用htmlentities()将umlauts(德语特殊字符)更改为HTML实体。

以下测试对我有效:

<?php
    $test = array( 'bla' => 'äöü' );
    $test['bla'] = htmlentities( $test['bla'] );

    echo json_encode( $test );
?>

5
这里唯一重要的一点是json_encode()只支持UTF-8编码。所有字符串数据必须采用UTF-8编码。因此,当您在非UTF-8字符串中有任何特殊字符时,json_encode将返回null值。所以,您可以将整个项目切换到UTF-8,或者在使用json_encode()之前确保对任何字符串进行utf8_encode()。http://www.php.net/manual/en/function.json-encode.php

0

请确保翻译文件本身已明确存储为UTF-8

之后重新加载缓存块和翻译


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接