Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么两个编码相同的单词在HTMLEntity中看起来不同?_Php_Encoding_Utf 8 - Fatal编程技术网

Php 为什么两个编码相同的单词在HTMLEntity中看起来不同?

Php 为什么两个编码相同的单词在HTMLEntity中看起来不同?,php,encoding,utf-8,Php,Encoding,Utf 8,我有一个关于UTF-8和htmlentities的问题。我有两个希腊文本变量,它们似乎都是UTF-8编码的(根据mb_detect_encoding())。当我输出这两个变量时,它们在浏览器中看起来完全相同(同样在源代码中)。 当我意识到,一个简单的if($var1==$var2)总是失败,尽管它们看起来完全一样。因此,我使用htmlentities来查看html代码是否相同。当我看到第一个变量看起来像这样时,我很惊讶:Ï�κÏ�λοÏ�

我有一个关于UTF-8和htmlentities的问题。我有两个希腊文本变量,它们似乎都是UTF-8编码的(根据mb_detect_encoding())。当我输出这两个变量时,它们在浏览器中看起来完全相同(同样在源代码中)。
当我意识到,一个简单的
if($var1==$var2)
总是失败,尽管它们看起来完全一样。因此,我使用htmlentities来查看html代码是否相同。当我看到第一个变量看起来像这样时,我很惊讶:
Ï�κÏ�λοÏ�&iota&阿尔法&ro。两个编码相同(UTF-8)的相同单词怎么会不同呢?那么我该如何解决这个问题呢?

你的第一个问题是:两个编码相同的单词(UTF-8)怎么会不同呢

在本例中,两种情况下的编码都不是真正的UTF-8。第一个变量是“实”UTF-8,而在第二个变量中,希腊字符不是真正的UTF-8,而是ASCII,非ASCII字符(希腊)使用称为CER(字符实体引用)的东西进行编码

web浏览器和一些过于友好的“WYSIWYG”编辑器会将这些字符串呈现为相同的,但实际字符串的二进制表示(这是计算机将要比较的)是不同的。这就是equal测试失败的原因,即使在浏览器或编辑器中进行人工视觉显示时字符串似乎相同

我认为在这种情况下,您不能依靠
mb_detect_encoding
来检测编码,因为使用CER来表示非ASCII无法区分utf-8和ASCII

你的第二个问题是:我如何解决这个问题

在比较可能采用不同编码的字符串之前,需要将它们转换为规范形式(),以便它们的二进制表示形式相同

下面是我如何解决这个问题的:我实现了一个名为
utf8\u normalize
的简便函数,它在比较字符串之前将几乎所有常用字符表示(在我的例子中:CER、NER、iso-8859-1和CP-1252)转换为规范的utf-8。在某种程度上,您输入的内容必须由您的软件将运行的环境类型中的“流行”字符表示形式决定,但是如果您在比较之前确保字符串是标准形式的,那么它将起作用


正如OP(phpheini)在下面的评论中所指出的,还有,它可能比一个自产函数在规范化方面做得更好。

这两个变量是如何分配的?其中一个存储在通过会话(在另一个文件中创建)传递的数组中,另一个由curl获取并存储在一个数组中。您能否在这两个变量上发布调用
urlencode
的结果?这将向我们显示实际存在的字节。这是一个示例:
%CE%B1%CF%85%CF%84%CE%BF%CE%BA%CE%AF%CE%BD%CE%B7%CF%84%CE%BF
(第一个变量),
%26alpha%3B%26upsilon%3B%26tau%3B%26omicron%3B%26kappa%3B%26%23943%3B%nu%3B%26eta%3B%26tau%26omicron%3B
(第二个变量)我刚刚发现,从5.3.0()版本开始,甚至有一个类可以将字符串规范化为在PHP中实现的规范