我的自动完成搜索功能中断了,因为带有重音的字符是如何存储在mySQL中的。
例如,在mySQL列中,the存储为\u00c9
在接收用户输入并调用mySQL的PHP中,is \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"发布于 2019-08-23 23:25:29
第一个斜线用于防止转义“斜杠”/,顾名思义,不要期望它阻止转义返回斜杠\
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的东西,那么您必须将这个字符串作为输入\u00c9,json_encode()没有做错,您使用字符串"\u00c9“而不是Unicode字符00c9,它在字符串开始时避开了反斜杠。
您的$criteria变量可能包含一个JSON编码的字符串,如"\u00c9",该字符串是在没有使用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"
"\/"
"/"
"\\"https://stackoverflow.com/questions/57633664
复制相似问题