2012-08-22 12 views
5

PHP関数mb_detect_encodingにいくつか問題があります。 ISO-8859-1に変換できません。どんな助け?mb_convert_encoding issues

コード:

$str = "åäö"; 
$encoding = mb_detect_encoding($str); 
echo $encoding; 

$encoding = mb_detect_encoding(mb_convert_encoding($str, "ISO-8859-1")); 
echo $encoding; 

出力:

UTF-8

UTF-8

更新日:解決策:

mb_detect_orderを配列( 'UTF-8'、 'ISO-8859-1')に更新しました。

+0

あなたの 'mb_detect_order()'とは何ですか? – Passerby

+0

さて、そこに行くよ。私は最初にmb_detect_orderをUTF-8に更新しました。ありがとう! – brasimon

+0

問題を解決した場合は、回答として投稿し、できれば受け入れてください。 –

答えて

-2

私は配列へのmb_detect_order( 'UTF-8'、 'ISO-8859-1')更新され、それはあなたが実際にあなたの文字列を変換していませんでした

+0

あなたは、変換が成功したと信じるように自分を騙しています。 c3a5c3a4c3b6は、UTF-8とISO-8859-1の両方で有効なバイト文字列(2つのケースで異なることを表す)であるため、mb_detect_orderを取得してどちらのエンコーディングとしても報告できます。 – borrible

+0

@borrible彼の 'mb_internal_encoding'が既にUTF-8に設定されているとしたら? – Passerby

+0

@Passerby - これは私たちが見ているものと一致しません。文字列が実際にISO-8859-1に変換された場合は、バイトシーケンスe5e4f6になります。これは有効なUTF-8ではないので、mb_convert_encodingはUTF-8を報告しませんでした。ただし、シーケンスがc3a5c3a4c3b6(有効なUTF-8またはISO-8859-1)のままになっている場合は、このような状況が発生します。 – borrible

6

を働きました。むしろ、mb_convert_encodingの呼び出しは、元の文字列がUTF-8であるとはみなしませんでした。呼び出しの前の文字列は、すでにISO-8859-1であった可能性のあるバイトシーケンスであった(アイテムを別々に表現していたはずです)。これは、mb_detect_encodingを呼び出すのではなく、bin2hexを文字列に使用し、変換呼び出しの後にバイトシーケンスを確認することでわかります。バイトシーケンスが変更されていないことがわかります。

変換を機能させるには、元のエンコーディング(この場合)を伝える必要があります。使用:

mb_convert_encoding($str, 'ISO-8859-1','utf-8'); 

これ以降のバイトシーケンスを調べると、変換が行われていることがわかります。

+0

ISO-8859-1はエンコーディング "文字列"(つまり、無効な無効バイトシーケンス)のために機能しますか? – Pacerier