【问题标题】:Visually same string gives different var_dumps in php视觉上相同的字符串在 php 中给出不同的 var_dumps
【发布时间】:2015-07-29 03:10:20
【问题描述】:

更新: Anwer 在这里PHP unserialize fails with non-encoded characters?

我正在尝试将对象与 in_array 匹配。除了将此字符串作为属性的对象之外,这工作正常。视觉上它们是相同的,但是当我执行 var_dump PHP 时会看到不同的长度。

var_dump 结果:

string(26) "Waar    zijn mijn centjes????"
string(31) "Waar    zijn mijn centjes????"

可能是什么原因?一些我不知道的 ascii 值?

【问题讨论】:

  • 你查看源代码了吗?,一些隐藏字符,空格?!
  • 这是因为 UTF。例如。这个var_dump("åèö"); 导致了这个string(6) "åèö" 所以我认为你不能在视觉上比较它们。
  • 好的。这就说得通了。但是我该如何解决呢?当我调用 in_array 时,如何让 PHP 给我“真实”
  • 某处可见。试试这个: in_array( mb_strtolower($str, "UTF-8"), $arr)
  • 尝试用 bin2hex 输出字符串,你会看到不同

标签: php string var-dump


【解决方案1】:

让我们看看你的字符串的十六进制转储:

57616172097a696a6e206d696a6e2063656e746a6573f09f91bc

57616172097a696a6e206d696a6e2063656e746a657326237831663437633b

我们可以清楚地看到,最后只有一个区别:f09f91bc 变成了26237831663437633b

那么有什么区别呢?

f09f91bcU+1F47C BABY ANGEL character (👼) 的十六进制表示,因此是完美的UTF-8。

但是26237831663437633b 不再是 UTF-8,字符串实际上是 ASCII 并转换为 👼,所以它只是 HTML 对婴儿天使字符的数字字符引用。

所以天使必须在某个地方被翻译成它的 HTML 数字字符引用,而这不仅仅是在从文件或数据库中写入和读取时发生的事情。我猜它发生在您的输出处理中的某个地方。

您可以使用 html_entity_decode 将 HTML 实体转换回其 UTF-8 等效项:

$a = html_entity_decode('Waar    zijn mijn centjes👼');
$b = 'Waar    zijn mijn centjes?';
var_dump($a === $b);

请参阅http://phpfiddle.org/lite/code/n6t1-d9w7 以尝试代码。

【讨论】:

  • 好的。首先。非常感谢您的参与。我认为这是 Wordpress 自动执行的操作。你知道有什么方法可以把它从 ASCII 改回 UTF-8 吗?
  • @MarcvanNieuwenhuijzen 你还需要什么来回答你的问题吗?
  • 很遗憾,这也不是解决方案
  • @MarcvanNieuwenhuijzen 我已经在我的答案中添加了代码。它似乎适用于给定的字符串。它在哪里不起作用?
  • 您先生,今天是我绝对的英雄。我不知道为什么它在我最后一次尝试中不起作用。我想我可能使用了 html_entity_decode 两次,所以解码后的字符串再次被解码。但。它现在可以工作了!非常感谢您的时间和精力
【解决方案2】:

这是我的情况:

$plan_name: string(29) "check-up & template optimizer"
$cell_comp: string(33) "check-up & template optimizer"

这里的问题是 '&' 在第一个字符串中被视为 HTML 字符,而在第二个字符串中被视为 ASCII 实体。

如果您不了解其中的区别,请看这里(请参阅“符号”和“HTML 编号”列之间的区别):https://ascii.cl/htmlcodes.htm

解决办法:在两个字符串上应用同一个函数,可以是:

  • 要么将 ASCII 实体转换为对应的字符:html_entity_decode()
  • 将 HTML 字符转换为相应的 ASCII 实体:htmlentities()

这是我的最终结果:

$plan_name = html_entity_decode( strtolower( sanitize_text_field($key) ) );
$cell_comp = html_entity_decode( strtolower( sanitize_text_field($cell_2) ) );

if( $plan_name == $cell_comp ) :
 ...
endif;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多