视觉上相同的字符串在 php 中给出不同的 var_dumps

Visually same string gives different var_dumps in php

更新:答案在这里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 值?

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

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 以尝试代码。

这是我的案例:

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

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

如果你不明白其中的区别,请看这里(查看'Symbol'和'HTML Number'列之间的区别):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;