この回答のすべては私のコードhereとhereの私の読書に基づいています。
私はそれを書いていない、私はデバッガでそれを踏んでいない、これは私の解釈のみです。
非strictモードがはの一部であり得ることをサブシーケンスを可能にしながら、意思は、全体として文字列をエンコードするために有効であったかどうかを確認するために厳格なモードのためだったようです有効な文字列。たとえば、文字列がマルチバイト文字の最初のバイトになるように終了した場合、strictモードでは一致しませんが、非strictモードではUTF-8として修飾されます。
ただし、厳密でないモードでは、状況によっては文字列の最初のバイトだけがチェックされているバグがあるようです。
例:
バイト0xf8
はUTF-8にはどこにも許可されていません。文字列の先頭に配置すると、mb_detect_encoding()
は、どのモードが使用されているかにかかわらず、正しくfalseを返します。
$str = "\xf8foo";
var_dump(
mb_detect_encoding($str, 'UTF-8'), // bool(false)
mb_detect_encoding($str, 'UTF-8', true) // bool(false)
);
しかし限り先頭バイトはUTF-8配列のどこにでも起こり得るように、非厳密モードはUTF-8を返します。
$str = "foo\xf8";
var_dump(
mb_detect_encoding($str, 'UTF-8'), // string(5) "UTF-8"
mb_detect_encoding($str, 'UTF-8', true) // bool(false)
);
だから、あなたのISO-8859-1文字列
'áéóú'
は、有効なUTF-8、UTF-8と
mb_detect_encoding()
誤っような文字列を返すに発生する可能性があります最初のバイト
"\xe1"
ない間。私は最終的にそのフラグは[こちら](https://github.com/php/php-src/blob/に通過します
https://bugs.php.net/bug.php?id=72933
で、このためのレポートを開いた*
c72282a13b12b7e572469eba7a7ce593d900a8a2/ext/mbstring/libmbfl/mbfl/mbfilter.c#L718);しかし、私はそれが何かを把握することができれば私は気になるでしょう... – deceze
FWIW、*もう一つの理由は、*検出*エンコーディングは基本的に不可能なので、この機能を使用しないでください。それにもかかわらず、非常に興味深い質問です。 – deceze
@deceze面白い:ソースコード全体の 'strict'に関する唯一のコメントは'/* set strict flag */'です。 –