JSON中包含特殊字符如é

20

我正在使用jQuery、PHP和JSON作为响应来开发一个依赖选择脚本。

一切都很顺利,除了使用特殊字符,比如法语(é,è,à...)

如果我像这样预编码它们(é,è,à)(这里我在单词“和”和余下的字之间用空格以防止我的问题自动编码),就可以工作了。但是当用jQuery渲染时,字符没有转换成应该看起来的样子(é...),而是显示原始值(é)

如果我像这样写(é)并且不预编码它们,则不会显示此数组条目的完整值。

我该怎么做?

谢谢。


1
通常情况下,不需要对东西进行实体化操作,因为jQuery会为您完成它。 - NullUserException
1
@NullUserException:并不是jQuery“使你的东西成为实体”。它甚至根本没有被实体化。 - Tomalak
@Tomalak 嗯……我指的是.text(),它会将某些字符转换为它们的 HTML 实体等效项(通过createTextNode())。 - NullUserException
@NullUserException:不,它不会。text()设置DOM节点的textContent属性。HTML字符实体仅存在于序列化的HTML中(即当HTML表示为文本时),它们甚至不存在于DOM中。 - Tomalak
3个回答

10
如果我像这样写(é),而不对它们进行预编码,则不会显示此数组条目中的完整值。
在JSON中,您不需要对值进行HTML编码。您可以直接发送它们(如(é)),并正确设置Content-Type。
header('Content-Type: application/json; Charset=UTF-8');

当然,声明数据的编码。


好的,我刚刚在将要发送JSON响应的文件中,在json_encode()之前添加了这个标题,并尝试了两种方法(é和&eacute),但问题仍然存在。 - medk
@medk:首先,停止尝试使用&eacute。你不是在处理HTML,所以这与你的问题完全无关。你是否尝试过未经修改的标题,或者使用了实际的数据编码? - Tomalak
是的,我在 Firefox 中明确将编码设置为 utf-8,用于显示结果的页面上,并尝试了包含两种类型(普通和编码)的响应,普通的从未显示,而预编码的则按原样显示,因此始终存在相同的问题。 - medk
@medk:在Firefox中设置编码方式并不重要。你必须确保服务器使用宣传的编码方式发送字符:当头部显示UTF-8时,数据必须是UTF-8。如果你的数据不是UTF-8(我怀疑它不是),那么你必须相应地更改头部。 - Tomalak

7

这对我有用,希望对其他遇到类似问题的人也有用。

$title = 'é';
$title = mb_convert_encoding($title, "UTF-8", "HTML-ENTITIES");

header('Content-Type: application/json; Charset="UTF-8"');
echo json_encode(array('title' => $title));

mb_convert_encoding函数接受一个值,并将其从(在本例中)HTML-ENTITIES转换为UTF-8。

有关该函数的更多详细信息,请参见此处http://php.net/manual/en/function.mb-convert-encoding.php


你太棒了!使用 PHP 库将 MySQL utf.8 转换为 Firebase 时,对我非常有帮助。 - Matt H
好人,针对我的代码功能,使用以下代码:echo json_encode(mb_convert_encoding($this->jsonRet, "HTML-ENTITIES", "UTF-8")); - Rinos

6

就像第一个答案一样

您是否使用数据库?如果是,请确保数据库表已声明为UTF8。 HTML页面如何声明? UTF-8 字符串在PHP脚本文件中吗?如果是,请确保文件具有UTF-8文件格式。

您还可以使用utf8_encode(发送到HTML)和utf8_decode(接收),但不是正确的方法。


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