PHP - 用正确的 Unicode 符号替换 JSON
PHP - Replace JSON with the correct Unicode symbol
好的,所以我有一些 JSON,当解码时,我打印出结果。在解码 JSON 之前,我使用 stripslashes() 删除多余的斜杠。 JSON 包含网站链接,例如 https://www.w3schools.com/php/default.asp 和描述 Hello World, I have u00249999999 dollars
当我打印出 JSON 时,我希望它能打印出来
Hello World, I have 99999 dollars
,但它打印出 Hello World, I have u00249999999 dollars
。
我假设 u0024
没有被解析,因为它没有反斜杠,尽管问题是网站链接的正斜杠没有通过带斜杠删除,这很好 - 我认为使用 stripslashes();
删除了 Unicode 符号的反斜杠
如何让 PHP 自动检测和解析 Unicode 美元符号?我还想将此规则应用于每个 Unicode 符号。
提前致谢!
您的假设是正确的:u0024
没有被解析,因为它没有反斜杠。您可以使用正则表达式在转换后添加反斜杠。
看起来你内部有 UTF-8 编码的字符串,PHP 正确输出它们,但你的浏览器无法 auto-detect 编码(它决定使用 ISO 8859-1 或其他编码).
最好的方法是通过发送相应的 HTTP 告诉浏览器正在使用 UTF-8 header:
header("content-type: text/html; charset=UTF-8");
然后,您可以保留其余代码 as-is,而不必 html-encode 实体或造成其他混乱。
如果需要,您可以使用 <meta>
标记在生成的 HTML 中额外声明编码:
<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> for HTML <=4.01
<meta charset="UTF-8">
对于 HTML5
HTTP header 优先于 <meta>
标签,但如果 HTML 保存到 HD 然后在本地读取,后者可能有用。
根据PHP documentation on stripslashes ()
,它
un-quotes a quoted string.
这意味着,它基本上删除了所有用于转义字符(或 Unicode 序列)的反斜杠。删除这些时,您基本上没有机会完全确定 "u0024"
中的任何序列都是一个 Unicode 实体,您的用户可能只是输入了那个。
除此之外,在包含转义引号的 JSON 值上使用 stripslashes ()
时会遇到一些麻烦。考虑这个例子:
{
"key": "\"value\""
}
这将在使用 stripslashes ()
时失效,因为它看起来像这样:
{
"key": ""value""
}
无法解析,因为它不是有效的 JSON 对象。当您不使用 stripslashes ()
时,所有转义序列将由 JSON 解析器转换,并且在将(已解码的)JSON 对象输出到客户端之前,PHP 将自动解码(或 "convert")您的数据可能包含的 Unicode 序列。
结论: 我建议在处理 JSON 实体时不要使用 stripslashes ()
,因为它可能会破坏事物(如上例所示) , 也在你的问题中)。
您必须了解的主要问题是,为什么需要去除斜杠?
而且,如果真的有必要去除斜线,如何管理编码?使用 html_entity_decode .
将 unicode 符号 before 转换为去除斜线可能是个好主意,而不是之后
无论如何,您可以尝试使用此解决方法解决问题:
$string = "Hello World, I have u00249999999 dollars";
$string = preg_replace( "/u([0-9A-F]{0,4})/", "&#x;", $string ); // recover "u" + 4 alnums
$string = html_entity_decode( $string, ENT_COMPAT, 'UTF-8' ); // convert to utf-8
好的,所以我有一些 JSON,当解码时,我打印出结果。在解码 JSON 之前,我使用 stripslashes() 删除多余的斜杠。 JSON 包含网站链接,例如 https://www.w3schools.com/php/default.asp 和描述 Hello World, I have u00249999999 dollars
当我打印出 JSON 时,我希望它能打印出来
Hello World, I have 99999 dollars
,但它打印出 Hello World, I have u00249999999 dollars
。
我假设 u0024
没有被解析,因为它没有反斜杠,尽管问题是网站链接的正斜杠没有通过带斜杠删除,这很好 - 我认为使用 stripslashes();
如何让 PHP 自动检测和解析 Unicode 美元符号?我还想将此规则应用于每个 Unicode 符号。
提前致谢!
您的假设是正确的:u0024
没有被解析,因为它没有反斜杠。您可以使用正则表达式在转换后添加反斜杠。
看起来你内部有 UTF-8 编码的字符串,PHP 正确输出它们,但你的浏览器无法 auto-detect 编码(它决定使用 ISO 8859-1 或其他编码).
最好的方法是通过发送相应的 HTTP 告诉浏览器正在使用 UTF-8 header:
header("content-type: text/html; charset=UTF-8");
然后,您可以保留其余代码 as-is,而不必 html-encode 实体或造成其他混乱。
如果需要,您可以使用 <meta>
标记在生成的 HTML 中额外声明编码:
<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> for HTML <=4.01
<meta charset="UTF-8">
对于 HTML5
HTTP header 优先于 <meta>
标签,但如果 HTML 保存到 HD 然后在本地读取,后者可能有用。
根据PHP documentation on stripslashes ()
,它
un-quotes a quoted string.
这意味着,它基本上删除了所有用于转义字符(或 Unicode 序列)的反斜杠。删除这些时,您基本上没有机会完全确定 "u0024"
中的任何序列都是一个 Unicode 实体,您的用户可能只是输入了那个。
除此之外,在包含转义引号的 JSON 值上使用 stripslashes ()
时会遇到一些麻烦。考虑这个例子:
{
"key": "\"value\""
}
这将在使用 stripslashes ()
时失效,因为它看起来像这样:
{
"key": ""value""
}
无法解析,因为它不是有效的 JSON 对象。当您不使用 stripslashes ()
时,所有转义序列将由 JSON 解析器转换,并且在将(已解码的)JSON 对象输出到客户端之前,PHP 将自动解码(或 "convert")您的数据可能包含的 Unicode 序列。
结论: 我建议在处理 JSON 实体时不要使用 stripslashes ()
,因为它可能会破坏事物(如上例所示) , 也在你的问题中)。
您必须了解的主要问题是,为什么需要去除斜杠? 而且,如果真的有必要去除斜线,如何管理编码?使用 html_entity_decode .
将 unicode 符号 before 转换为去除斜线可能是个好主意,而不是之后无论如何,您可以尝试使用此解决方法解决问题:
$string = "Hello World, I have u00249999999 dollars";
$string = preg_replace( "/u([0-9A-F]{0,4})/", "&#x;", $string ); // recover "u" + 4 alnums
$string = html_entity_decode( $string, ENT_COMPAT, 'UTF-8' ); // convert to utf-8