gpt4 book ai didi

php - 理解 PHP 的 mb_detect_encoding 和 mb_check_encoding 函数的结果

转载 作者:行者123 更新时间:2023-12-03 21:33:27 24 4
gpt4 key购买 nike

我试图理解这两个函数的逻辑 mb_detect_encoding mb_check_encoding ,但文档很差。从一个非常简单的测试字符串开始

$string = "\x65\x92";
当使用 Windows-1252 编码时,它是小写的“a”后跟一个 curl 引号。
我得到以下结果:
mb_detect_encoding($string,"Windows-1252"); // false
mb_check_encoding($string,"Windows-1252"); // true
mb_detect_encoding($string,"ISO-8859-1"); // ISO-8859-1
mb_check_encoding($string,"ISO-8859-1"); // true
mb_detect_encoding($string,"UTF-8",true); // false
mb_detect_encoding($string,"UTF-8"); // UTF-8
mb_check_encoding($string,"UTF-8"); // false
  • 我不明白为什么mb_detect_encoding根据 https://en.wikipedia.org/wiki/ISO/IEC_8859-1 为字符串提供“ISO-8859-1”而不是“Windows-1252”和 https://en.wikipedia.org/wiki/Windows-1252 , 字节 x92在 Windows-1252 字符编码中定义,但不在 ISO-8859-1 中定义。
  • 其次,我不明白如何mb_detect_encoding可以退货false ,但是 mb_check_encoding可以退货true对于相同的字符串和相同的字符编码。
  • 最后,我不明白为什么字符串可以被检测为 UTF-8,严格模式与否。字节 x92是 UTF-8 中的连续字节,但在此字符串中,它跟在有效字符字节之后,而不是序列的前导字节。
  • 最佳答案

    你的例子很好地说明了为什么mb_detect_encoding应该谨慎使用,因为它不直观,有时在逻辑上是错误的。如果必须使用,总是 传入 strict = true作为第三个参数(因此非 UTF8 字符串不会被报告为 UTF-8。

    运行 mb_check_encoding 更可靠一点在一系列所需的编码上,按照可能性/优先级的顺序。例如:

    $encodings = [
    'UTF-8',
    'Windows-1252',
    'SJIS',
    'ISO-8859-1',
    ];

    $encoding = 'UTF-8';
    $string = 'foo';
    foreach ($encodings as $encoding) {
    if (mb_check_encoding($string, $encoding)) {
    // We'll assume encoding is $encoding since it's valid
    break;
    }
    }

    排序取决于您的优先级。

    关于php - 理解 PHP 的 mb_detect_encoding 和 mb_check_encoding 函数的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39920212/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com