4

まず、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');

これは私を混乱させています!

ふぅ、誰かがこれに光を当てることができますか? ありがとうございます!

4

3 に答える 3

2

これは既知のバグです。

Windows-1251Windows-1252文字列全体が特定の範囲の上位バイト文字で構成されている場合にのみ成功します。つまり、テキストが のように表示されるため、正しい変換が得られませ ISO-8859-1Windows-1252

LATIN1からに変換するこの問題に遭遇しましたUTF-8。Microsoft Word から多くのコンテンツを貼り付け、MySQL テーブルの文字セットをVARCHAR使用してフィールドに格納しました。LATIN1おそらくご存じのとおり、Word はアポストロフィと引用符をスマート アポストロフィとカーリー クォーテーションに変換します。これらの文字は適切に変換されなかったため、画面に表示されませんでした。テキストは常に として識別されましISO-8859-1た。問題を解決するために、アポストロフィと引用符 (およびその他の文字)からWindows-1252toおよびその両方への変換を強制しましたが、適切に変換されました。UTF-8

于 2014-06-11T22:07:17.270 に答える
1

すべての質問にお答えできるかどうかわかりませんが、次のとおりです。

私が理解しているように、windows-1252 は iso-8859-1 のスーパーセットです。utf8_encode() の代わりに iconv('Windows-1252', 'UTF-8', $str) を使用しない理由

ut8_encode を気にする必要はありません。iconv() または mb_convert_encoding に移動します。ut8_encode は、ISO-8859-1 のみを UTF-8 に変換します。異なるエンコーディング間で変換する必要がある場合は、他の関数を使用する必要があります。

ユーロマークに関して。これがISO-8859-1に(公式または非公式に)追加されたかどうかはわかりませんが、以下のステートメントは両方ともtrueを返します

$ansi = "€";//euro mark, the code file itself is in ansi

$detected = mb_detect_encoding($ansi, "WINDOWS-1252", TRUE);// $detected == "Windows-1252"
echo $detected."<br/>-<br/>";
$detected = mb_detect_encoding($ansi, "ISO-8859-1", TRUE);// $detected == ISO-8859-1
echo $detected."<br/>-<br/>";


$detected = mb_detect_encoding($ansi, "WINDOWS-1252");// $detected == "Windows-1252"
echo $detected."<br/>-<br/>";
$detected = mb_detect_encoding($ansi, "ISO-8859-1");// $detected == ISO-8859-1
echo $detected."<br/>-<br/>";

これは、strict を True または False に設定した結果です。それは理由を説明するかもしれません

$detect_order = array('ASCII', 'ISO-8859-1', 'Windows-1252','UTF-8'); はすべきではありません。次の結果が得られたので、これが間違っていることはわかっています

ISO-8859-1 を提供します。後者の順序でISOの前にUTF-8を切り替えたことに気付きました。これが、最後にUTF-8を提供した理由です。

取得したいものに対して ('ASCII', 'ISO-8859-1', 'Windows-1252','UTF-8') の検出順序が間違っているのはなぜですか?

PHP のサイトhttp://us3.php.net/manual/en/function.mb-detect-order.phpによると、UTF-8 の前に ISO を設定すると、常に ISO が返されます。役に立たない検出順序の例を確認してください。

私が見たところ、そこに ISO-8859-1 と Windows-1252 の両方があれば、ISO を取り戻すことができるようです。どちらか一方を取り出せば、残りの 2 つが得られます。したがって、下の最後の2つの位置は違いを生むようには見えません

$detect_order = array('ASCII', 'UTF-8', 'Windows-1252', 'ISO-8859-1'); $detect_order = array('ASCII', 'UTF-8', 'ISO-8859-1', 'Windows-1252');

于 2011-11-17T16:04:50.330 に答える
-3

€ 記号は utf8 エンコーディングの一部ではありません!

あなたは€としてそれを置かなければなりません!

または、windows-1252 または iso-8859-15 にエンコードします (iso-8859-1 と同じですが、€ 記号があります)

于 2012-12-22T16:07:49.373 に答える