【问题标题】:json_encode JSON_UNESCAPED_SLASHES not working and still escaping slashesjson_encode JSON_UNESCAPED_SLASHES 不工作并且仍在转义斜杠
【发布时间】:2019-08-23 22:30:39
【问题描述】:

由于带有重音符号的字符在 mySQL 中的存储方式,我的自动完成搜索功能被破坏了。

例如,在 mySQL 列中,É 的存储方式类似于 \u00c9

在接收用户输入并调用mySQL的PHP​​中,É是\xc3\x89

json_encode() 几乎可以完美地将 "\xc3\x89" 转换为 "\u00c9"

$clean = json_encode($criteria, JSON_UNESCAPED_SLASHES);

除了将其转换为“\\u00c9”,因此即使它们都是 É,字符也不匹配。

JSON_UNESCAPED_SLASHES 选项不起作用。为什么它不阻止在反斜杠前面添加另一个反斜杠?

如何让它工作?

编辑:我刚刚在下面添加了实际代码和错误日志输出。代码:

error_log("criteria vvvvvvvvvvvvv");
error_log($criteria);

$clean = json_encode($criteria, JSON_UNESCAPED_SLASHES);  

error_log("json_encode(criteria) vvvvvvvvvvvvvv");
error_log($clean);

错误日志:

[Fri Aug 23] criteria vvvvvvvvvvvvvvv, 
[Fri Aug 23 \xc3\x89
[Fri Aug 23] json_encode(criteria) vvvvvvvvvvvvvvv, 
[Fri Aug 23] "\\u00c9"

【问题讨论】:

  • 我尝试了您在编辑部分提供的代码,这是我的输出[24-Aug-2019 06:06:47 UTC] criteria vvvvvvvvvvvvv [24-Aug-2019 06:06:47 UTC] É [24-Aug-2019 06:06:47 UTC] json_encode(criteria) vvvvvvvvvvvvvv [24-Aug-2019 06:06:47 UTC] "\u00c9"
  • 请仔细检查您的 $criteria 变量。并确保它不包含此字符串\u00c9,如果您设法解决了问题,请告诉我。祝你好运

标签: php character-encoding


【解决方案1】:

第一个JSON_UNESCAPED_SLASHES顾名思义是用来防止转义“SLASHES”/,不要指望它会防止转义back斜杠\

echo json_encode('/'); // prints "\/"
echo json_encode('/', JSON_UNESCAPED_SLASHES); // prints "/"
echo json_encode("\\", JSON_UNESCAPED_SLASHES); // prints "\\"
//note on line 3 : the input is 1 backslash

如您所见,它只防止转义斜杠,而不是反斜杠

关于您的问题,如果您最终使用 json_encode\\u00c9 之类的东西,那么您必须将此字符串作为输入 \u00c9json_encode() 没有错,您使用字符串 " \u00c9" 不是 Unicode 字符00c9 并且它在字符串开头转义了反斜杠。

您的 $criteria 变量可能包含一个 JSON 编码字符串,例如 "\u00c9",该字符串已在未使用 JSON_UNESCAPED_UNICODE 选项的情况下进行编码,换句话说,不要使用 json_encode() 两次。

检查这些例子,它可以解决问题

echo json_encode("É", JSON_UNESCAPED_SLASHES) . "\n";
echo json_encode("\u00c9", JSON_UNESCAPED_SLASHES) . "\n";
echo json_encode("\xc3\x89", JSON_UNESCAPED_SLASHES) . "\n";
echo json_encode("/") . "\n";
echo json_encode("/", JSON_UNESCAPED_SLASHES) . "\n";
echo json_encode("\\", JSON_UNESCAPED_SLASHES) . "\n";

这个输出

"\u00c9"
"\\u00c9"
"\u00c9"
"\/"
"/"
"\\"

live demo

【讨论】:

  • 感谢您的意见。 $criteria = "\xc3\x89";
  • @AndrewKoper 你得到"\\u00c9" 作为使用json_encode("\xc3\x89") 的输出?
  • 是的 - json_encode("\xc3\x89", JSON_UNESCAPED_SLASHES) 在 PHP 7.0.1 上为我输出 \\u00c9。我花了太多时间试图让这个 char 转换工作。感觉我快到了,但这令人沮丧。
  • 这个文件<?php echo json_encode("\xc3\x89", JSON_UNESCAPED_SLASHES);exit;会输出"\\u00c9"吗? !
  • 此时我将采取任何解决方案将 \xc3\x89 转换为 \u00c9(法语字符)
猜你喜欢
  • 2012-04-29
  • 2013-01-23
  • 2012-03-10
  • 2015-10-23
  • 2017-11-30
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多