将php中的HTML编号实体转换为unicode以在iPhone上使用

将php中的HTML编号实体转换为unicode以在iPhone上使用,php,iphone,objective-c,json,unicode,Php,Iphone,Objective C,Json,Unicode,我正在创建一个web服务来将json传输到iPhone应用程序。我使用json框架来接收json,这非常有效,因为它会自动解码“\u2018”之类的内容。我遇到的问题是,似乎没有一种全面的方法可以让所有的角色一蹴而就 例如,html\u entity\u decode()获取了大部分内容,但它留下了诸如“(‘;”之类的内容。为了捕获这些实体并将它们转换为json框架可以使用的东西(例如,\u2018),我使用这段代码将&#转换为\u,将数字转换为十六进制,然后去掉结尾的分号 funct

我正在创建一个web服务来将json传输到iPhone应用程序。我使用json框架来接收json,这非常有效,因为它会自动解码“\u2018”之类的内容。我遇到的问题是,似乎没有一种全面的方法可以让所有的角色一蹴而就

例如,
html\u entity\u decode()
获取了大部分内容,但它留下了诸如“(‘;”之类的内容。为了捕获这些实体并将它们转换为json框架可以使用的东西(例如,\u2018),我使用这段代码将&#转换为\u,将数字转换为十六进制,然后去掉结尾的分号

function func($matches) {
  return "\u" . dechex($matches[1]);
}
$json = preg_replace_callback("/&#(\d{4});/", "func", $json);
目前这对我来说很有效,但感觉不太对劲。看来我肯定错过了一些稍后会回来困扰我的角色

有人看到这种方法的缺陷吗?有人能想到这种方法会错过的角色吗


任何帮助都将不胜感激

是一个十进制数字实体,而我认为
\u2018
是一个十六进制表示。HTML还支持十六进制编号的实体(例如,
‘;
),但一旦您找到了作为实体前缀的
,您就会看到十进制或十六进制。也有命名实体(例如,
&;
),但听起来您不需要在代码中涵盖这些情况是一个十进制数字实体,而我认为
\u2018
是一个十六进制表示。HTML还支持十六进制编号的实体(例如,
‘;
),但一旦您找到了作为实体前缀的
,您就会看到十进制或十六进制。还有命名实体(例如,
&;
),但听起来您不需要在代码中涵盖这些情况。

您从哪里获得此HTML编码输入?如果您正在抓取网页,您应该使用HTML解析器,它将为您解码实体和字符引用。如果在表单输入数据中获取它们,那么编码就有问题(确保将包含表单的页面作为UTF-8提供,以避免出现这种情况)

如果必须将一段HTML编码的文本转换为JSON,那么应该先进行HTML解码,然后再进行JSON编码,而不是直接转换为JSON格式(对于其他需要转义的字符,这将失败)。使用内置的解码器和编码器功能,而不是自己尝试创建JSON编码的字符,如
\u…
(因为那里有陷阱)


你从哪里得到这个HTML编码的输入?如果您正在抓取网页,您应该使用HTML解析器,它将为您解码实体和字符引用。如果在表单输入数据中获取它们,那么编码就有问题(确保将包含表单的页面作为UTF-8提供,以避免出现这种情况)

如果必须将一段HTML编码的文本转换为JSON,那么应该先进行HTML解码,然后再进行JSON编码,而不是直接转换为JSON格式(对于其他需要转义的字符,这将失败)。使用内置的解码器和编码器功能,而不是自己尝试创建JSON编码的字符,如
\u…
(因为那里有陷阱)

这对我很管用


这对我来说很好

看起来json框架要求这些实体采用十六进制格式,例如.\u2018,以便解码。我的主要问题是为什么php函数html#u entity_decode()不能捕获‘;。这让我想知道还有什么是它没有捕获的。看起来json框架要求这些实体采用十六进制形式,例如。\u2018,以便解码。我的主要问题是为什么php函数html#u entity_decode()不能捕获‘;。这让我想知道还有什么是它抓不住的。谢谢@bobince!问题是我没有在html_entity_decode()函数中包含“utf-8”参数。我想我只是想,既然源代码是utf-8,那就假定它是。另外,至少在我的例子中,在json编码()之前还是之后执行html_entity_decode()没有任何区别。谢谢@bobince!问题是我没有在html_entity_decode()函数中包含“utf-8”参数。我想我只是想,既然源代码是utf-8,那就假定它是。另外,至少在我的例子中,我在json_encode()之前还是之后执行html_entity_decode()没有任何区别。
$html= 'abc " def Ӓ ghi ሴ jkl \n mno';
$raw= html_entity_decode($html, ENT_COMPAT, 'utf-8');
$json= json_encode($raw);

"abc \" def \u04d2 ghi \u1234 jkl \\n mno"
$html_escape = ""Love sex magic rise" & 尹真希 ‘";
$utf8 = mb_convert_encoding($html_escape, 'UTF-8', 'HTML-ENTITIES');
echo json_encode(array(
    "title" => $utf8
));

// {"title":"\"Love sex magic rise\" & \u5c39\u771f\u5e0c \u2018"}