Php 为什么mbstring函数不能正确识别ISO-8859字符串?

Php 为什么mbstring函数不能正确识别ISO-8859字符串?,php,character-encoding,iso-8859-1,mbstring,Php,Character Encoding,Iso 8859 1,Mbstring,尽管如此,mbstring函数可以互换地处理每个ISO-8859字符集。要将这一点带回家,请执行以下操作: $strings = [ 'English' => 'Ea vim decore sapientem repudiandae. Sea cu delenit gamu mutn, tic.', 'Cyrillic' => 'Лорем ипсум долор сит амет, ин ехерци вереар номинати яуи, сит ин омни

尽管如此,mbstring函数可以互换地处理每个
ISO-8859
字符集。要将这一点带回家,请执行以下操作:

$strings = [ 
  'English'   => 'Ea vim decore sapientem repudiandae. Sea cu delenit gamu mutn, tic.',
  'Cyrillic'  => 'Лорем ипсум долор сит амет, ин ехерци вереар номинати яуи, сит ин омниум инермис но.',
  'Greek'     => 'Λορεμ ιπσθμ δολορ σιτ αμετ, ηασ γραεcο νθσqθαμ cθ, εστ θτ εσσε διcαμ qθαλισqθε cθ.',
  'Armenian'  => 'լոռեմ իպսում դոլոռ սիթ ամեթ, եամ նո թաթիոն ծոմպռեհենսամ, իուս ադ նիսլ ոմնիս մինիմ եսթ',
  'Georgian'  => 'ლორემ იფსუმ დოლორ სით ამეთ, ეხ ყუანდო ცოფიოსაე უსუ, იუს ეუ ჰინც ვერო დომინგ ჰის',
  'Hindi'     => 'वर्ष एसेएवं व्याख्यान संदेश होने लक्षण एसेएवं पहोचाना विचरविमर्श? वर्णन करती आशाआपस अन्तरराष्ट्रीयकरन. रहारुप कार्यसिधान्त',
  'Korean'    => '모든 국민은 보건에 관하여 국가의 보호를 받는다, 전직대통령의 신분과 예우에 관하여는 법',
  'Arabic'    => 'مع لهذه الهجوم عدم, فكان اتفاق الصفحات من أسر. وجزر عُقر أما بـ, عل دار بقسوة المتّبعة بالولايات. وإقامة والفرنسي كل لكل. أي',
  'Hebrew'    => 'עמוד מדינות, חפש ואלקטרוניקה אנתרופולוגיה דת, מה קהילה הקהילה טכנו'
];

$encodings = ['ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15' ];

foreach( $strings as $lang => $text ) {
    echo $lang . " is encoded as " . mb_detect_encoding( $text, $encodings ) . "\n";

    foreach( $encodings as $encoding ) {
        echo " - is " . (mb_check_encoding( $text, $encoding ) ? "" : "not ") . $encoding . "\n";
    }
}
这会产生输出,效果如下:

Hindi is encoded as ISO-8859-1
  - is ISO-8859-1
  - is ISO-8859-2
  - is ISO-8859-3
  - is ISO-8859-4
  - is ISO-8859-5
  - is ISO-8859-6
  - is ISO-8859-7
  - is ISO-8859-8
  - is ISO-8859-9
  - is ISO-8859-10
  - is ISO-8859-13
  - is ISO-8859-14
  - is ISO-8859-15
这显然不是事实

为什么mbstring单独列出每个
ISO-8859
编码,但可以互换处理?是否有可靠的方法来检测正确的规格


还是我只是误用了这些函数?

mb\u detect\u编码
猜测编码可能是什么,这类事情不可能是准确的(而且这个函数没有太多尝试)

mb\u check\u encoding
告诉您字符串是否由对给定编码有效的字节序列组成,并且假设每个ISO-8859-*中的每个可能字节都有效,那么根据它们进行验证是毫无意义的(这些将始终返回
true


对于相关阅读,我非常推荐:

mb\u detect\u encoding
猜测编码可能是什么,这类事情不可能是准确的(而且这个函数没有做太多尝试),而
mb\u check\u encoding
只是告诉您字符串是否由对给定编码有效的字节序列组成。请使用
echo$lang。“编码为”。mb_检测_编码($text)。“\n”取而代之。见difference@PaulCrovella我懂了。。。这很不幸:/@riggsfully我当然看到了区别——我只是希望mbstring函数可以区分不同的
ISO-8859
编码。似乎模块应该将它们全部分组为
ISO-8859
,而不是单独列出它们,因为它实际上没有必要的逻辑来区分它们。
mb_detect_encoding
应该完全删除,它没有任何价值,只会让人感到困惑。不幸的是,在我关于mbstring函数的简短研究过程中,那篇文章在我的搜索结果中出现过几次,但我从未访问过它。O.oIt没有直接解决这个问题,无论是mbstring还是8859,但它确实有助于理解编码的确切含义。再加上PHP中的字符串不是一堆字符,而是一堆字节,各种各样的东西都会更有意义,相关的问题也会更容易让你绞尽脑汁。