好的,所以我有一些JSON,当解码时,我打印出结果。在解码JSON之前,我使用stripslashes()来删除额外的斜杠。 JSON包含网站链接,例如https://www.w3schools.com/php/default.asp和Hello World, I have u00249999999 dollars
当我打印出JSON时,我希望打印出来
Hello World, I have $9999999 dollars
,但会打印出Hello World, I have u00249999999 dollars
。
我假设u0024
没有被解析,因为它没有反斜杠,但事情是网站链接的正斜杠不会通过条带斜线删除,这很好 - 我认为反斜杠使用stripslashes();
如何让PHP自动检测并解析Unicode美元符号?我还想将此规则应用于每个Unicode符号。
提前致谢!
答案 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