PHP - 用正确的Unicode符号替换JSON

时间:2018-05-19 08:39:46

标签: php json unicode backslash stripslashes

好的,所以我有一些JSON,当解码时,我打印出结果。在解码JSON之前,我使用stripslashes()来删除额外的斜杠。 JSON包含网站链接,例如https://www.w3schools.com/php/default.aspHello World, I have u00249999999 dollars

等描述

当我打印出JSON时,我希望打印出来 Hello World, I have $9999999 dollars,但会打印出Hello World, I have u00249999999 dollars

我假设u0024没有被解析,因为它没有反斜杠,但事情是网站链接的正斜杠不会通过条带斜线删除,这很好 - 我认为反斜杠使用stripslashes();

删除Unicode符号

如何让PHP自动检测并解析Unicode美元符号?我还想将此规则应用于每个Unicode符号。

提前致谢!

3 个答案:

答案 0 :(得分:1)

您的假设是正确的:u0024未被解析,因为它没有反斜杠。您可以使用正则表达式在转换后添加反斜杠。

看起来你内部有UTF-8编码的字符串,PHP正确输出它们,但你的浏览器无法自动检测编码(它决定使用ISO 8859-1或其他一些编码)。

最好的方法是通过发送相应的HTTP标头告诉浏览器正在使用UTF-8:

header("content-type: text/html; charset=UTF-8"); 

然后,您可以按原样保留其余代码,并且不必对html编码实体或创建其他混乱。

如果需要,您还可以使用<meta>标记在生成的HTML中声明编码:

<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> for HTML <=4.01
<meta charset="UTF-8">

表示HTML5 HTTP标头优先于<meta>标签,但如果将HTML保存到HD然后在本地读取,则后者可能很有用。

答案 1 :(得分:1)

根据PHP documentation on stripslashes (),它

  

取消引用带引号的字符串。

这意味着它基本上删除了所有反斜杠,这些反斜杠用于转义字符(或Unicode序列)。删除它们时,你基本上没有机会完全确定"u0024"的任何序列是一个Unicode实体,你的用户可能只是输入了它。

除此之外,在对包含转义引号的JSON值使用stripslashes ()时,您会遇到一些麻烦。考虑这个例子:

{
  "key": "\"value\""
}

使用stripslashes ()时,这将无效,因为它将如下所示:

{
  "key": ""value""
}

哪个不可解析,因为它不是有效的JSON对象。当您不使用stripslashes ()时,所有转义序列都将由JSON解析器转换,在将(已解码的)JSON对象输出到客户端之前,PHP将自动解码(或“转换”)您的数据的Unicode序列可能包含。

结论:我建议在处理JSON实体时不要使用stripslashes (),因为它可能会破坏事物(如前面的示例所示,但也出现在您的问题中)。< / p>

答案 2 :(得分:1)

你必须要理解的主要问题是为什么你需要去除斜线? 而且,如果真的有必要删除斜线,如何管理编码?可能最好将unicode符号之前的转换为使用html_entity_decode去除斜杠,而不是之后。

无论如何,您可以尝试使用此解决方法解决问题:

$string = "Hello World, I have u00249999999 dollars";
$string = preg_replace( "/u([0-9A-F]{0,4})/", "&#x$1;", $string ); // recover "u" + 4 alnums
$string = html_entity_decode( $string, ENT_COMPAT, 'UTF-8' ); // convert to utf-8