这是我在项目中发现错误时想出的一段PHP代码片段。
print(($str == utf8_encode($str) ? "the same text" : "not the same text") . PHP_EOL);
print(mb_detect_encoding($str));现在,它的作用是告诉我一个字符串$str是否与它的UTF-8编码版本具有相同的编码,然后它输出它的初始编码。
我所期望的是UTF-8文本与原始文本相同,或者原始文本已经是UTF-8,因此UTF-8编码文本与原始文本相同。
但实际发生的是以下输出:
not the same text
UTF-8只有当我设置了$str = array_keys($_POST)[0];,并且在我的请求主体中使用了一个带有特殊字符的键,比如äöü=test,这样$str才会是äöü (直接在代码中定义它将不会产生相同的输出)时才会出现这种情况。
我从输出中解释了原始字符编码是UTF-8,但这两个字符串并不相同。如果我打印初始字符串,它是空的,编码后的字符串将是äöü。
我不明白当一个字符串用它自己的编码编码时,它会有什么不同。有人能给我解释一下吗?
发布于 2020-12-26 22:37:38
问题是您假设“原始文本已经是UTF-8,因此UTF-8编码的文本与原始文本相同”。
从PHP官方文档关于utf8_encode (https://www.php.net/manual/en/function.utf8-encode.php):
此函数用于将字符串数据从
-8859-1编码转换为UTF-8。
换句话说,这个函数是ISO-8859-1到UTF-8的转换器。如上所述,此函数的正确使用只需要ISO-8859-1字符串。因此,如果您使用另一种编码作为参数,您应该会遇到垃圾。
这个线程(PHP: Convert any string to UTF-8 without knowing the original character set, or at least try)讨论一个“符合UTF-8的任何字符”。
希望对你有帮助
https://stackoverflow.com/questions/65457279
复制相似问题