まず、PHP の mb_detect_order() の奇妙な動作 で、php の mb_detect_encoding に関する他の投稿を読みました 。これは、試行錯誤を通じて私が学んだことを確実に再確認します。しかし、私を混乱させることがまだいくつかあります。
データを収集してUTF-8 XMLに保存する、主に英語のサイトのhtmlスクレーパーを構築しています。ページ自体が ISO-8859-1 文字セットを宣言しているにもかかわらず、Windows-1252 に固有の文字が含まれているという問題に遭遇しました。具体的には、右の一重引用符 (') 0x92 です。私が理解しているように、windows-1252 は iso-8859-1 のスーパーセットです。utf8_encode() の代わりに iconv('Windows-1252', 'UTF-8', $str) を使用しない理由例: €‚ƒ' ' " ")
また
$ansi = "€";//euro mark, the code file itself is in ansi
$detected = mb_detect_encoding($ansi, "WINDOWS-1252");// $detected == "Windows-1252"
$detected = mb_detect_encoding('a'.$ansi, "WINDOWS-1252");// $detected == FALSE
$detected = mb_detect_encoding($ansi.'a', "WINDOWS-1252");// $detected == "Windows-1252"
$detected = mb_detect_encoding($ansi.'a', "WINDOWS-1252",TRUE);// $detected == FALSE
なぜこれが起こるのですか?文字列の最初の文字が windows-1252 でない場合、残りは Windows-1252 であっても失敗しますか? この動作はかなり役に立ちませんか? iso-8859-1 と windows-1252 を区別する限り
私を混乱させたもう1つのことは、ASCII、ISO-8859-1、windows-1252、UTF-8の間の文字セットを検出したいということでした。最低ランクのセットを与えるような方法で文字列を検出することは可能ですか? (すなわち。
$ascii = "123"; // desired detect result == 'ASCII'
$iso = "é".$ascii; // desired detect result == 'ISO-8859-1'
$ansi = "€".$iso; // desired detect result == 'Windows-1252'
$utf8 = file_get_contents('utf8.txt', true);//$utf8 == '你好123é€', desired detect result == 'UTF-8'
$detect_order = array('ASCII', 'ISO-8859-1', 'Windows-1252','UTF-8'); はすべきではありません。次の結果が得られたので、これが間違っていることはわかっています
$ascii == 'ASCII'
$iso == 'ISO-8859-1'
$ansi == 'ISO-8859-1'
$utf8 == 'ISO-8859-1'
取得したいものに対して ('ASCII', 'ISO-8859-1', 'Windows-1252','UTF-8') の検出順序が間違っているのはなぜですか?
私が得た最も近い望ましい戻り値は
$ascii == 'ASCII'
$iso == 'ISO-8859-1'
$ansi == 'ISO-8859-1'
$utf8 == 'UTF-8'
次の mb_detect_order 配列の両方で上記の値が得られました
$detect_order = array('ASCII', 'UTF-8', 'Windows-1252', 'ISO-8859-1');
$detect_order = array('ASCII', 'UTF-8', 'ISO-8859-1', 'Windows-1252');
これは私を混乱させています!
ふぅ、誰かがこれに光を当てることができますか? ありがとうございます!