【问题标题】:Why does PHP add additional slash to variable?为什么 PHP 会在变量中添加额外的斜线?
【发布时间】:2019-12-30 01:46:21
【问题描述】:

我正在处理法语字符对话问题。当 PHP 收到一个 É 时,它会将其转换为 \xc3\x89 (基本上是 UTF-8 十六进制)。 É 在 mySQL 数据库中存储为 \u00c9 (基本上是 UTF-16 十六进制)。我需要将前者转换为后者,以便它们匹配。 json_encode() 应该可以工作

//$criteria is \xc3\x89
error_log("criteria vvvvvvvvvvvvv");
error_log($criteria);

$clean = json_encode($criteria, JSON_UNESCAPED_SLASHES);  

error_log("json_encode() 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"

为什么要添加额外的斜线?它使字符不匹配。我怎么没有那个?是阿帕奇吗? ZF1? PHP 7.0.1? ubuntu 16.04?

【问题讨论】:

  • 你能试试error_log以外的东西吗?目前尚不清楚需要进行哪些额外处理。
  • 值得\u00c9 不是 UTF-16,而是一个 unicode 代码点。不过,这并不能解决您的问题
  • 不是斜线。它被命名为反斜杠。从 docs 获取 JSON 常量:“JSON_UNESCAPED_SLASHES - 不要转义 /。”所以它与反斜杠无关。

标签: php apache zend-framework character-encoding char


【解决方案1】:

当您对原始 Unicode 字符 (\x3c\x89) 调用 json_encode() 时,它会首先尝试将其转换为 Unicode 字符,即字符串“\u00c9”。

然后,为了将该值存储到 JSON 字符串中,它需要确保在以后解码时保留“u”之前的“\”。

如果它没有添加额外的斜杠,那么当 JSON 解析器稍后读取该值时,它会将 "\u" 视为转义的 "u" 字符,你最终会得到一个字符串 "u00c9"只是一堆字母和数字,而不是 Unicode 字符。

所以为了确保它解码回“\u00c9”,它必须被编码为“\\u00c9”

如果您不希望 json_encode() 先尝试将原始字节转换为 Unicode 字符,则可以使用 JSON_UNESCAPED_UNICODE 标志将其保留为原始数据:

<?php
$rawBytes = "É";
echo json_encode($rawBytes) . "\n"; // Output: "\u00c9"
echo json_encode($rawBytes, JSON_UNESCAPED_UNICODE) . "\n"; // Output: "É"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2012-03-19
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多