2016-06-22 8 views
0

エンコードされた文字列をutf-8に変換する際に問題があります。HTMLエンティティからUTF-8への変換

ドキュメンテーションによると、数字のHTMLエンティティを使用してエンコードされたUnicode文字列がリストされています。いくつかは:

$str = 'WÖGER'; // seems to be WÖGER 
$str = 'Jürgen'; // seems to be Jürgen 
$str = 'POßNITZ'; // seems to be POßNITZ 
$str = 'SCHLÄGER'; // seems to be SCHLÄGER 

私はそれらをデコードしてutf-8に変換したいと思います。

mb_convert_encoding()HTML-ENTITIES paramとhtml_entity_decode()の両方を試しました。私の最良の結果は、予想外であった。

html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'); 

、それはJürgensuccessfullyをデコード。しかし、私はこのリストから他の文字列をデコードする運がありません。私はISO-8859-1ウムラウト用のテーブルとHTMLコードを見て、私のリストにあるものとは異なっています。

私の質問は、いくつかの明らかなデコードのステップがないか、ソースの文字列に何か問題がありますか?

更新(2016-06-27):元の文字列は間違ってエンコードされていました。これらの文字列はLatin-1コンテキストでUTF-8値を読み取った後、個々の1バイト文字を16進数エンコードとしてエンコードした結果で、ドイツ語のウムラウトüüになり、別々の2文字としてエンコードされました。受け入れられた回答は、それらをUTF-8にまっすぐにデコードします。

+0

ISO-8859ではなく、* UTF-8 *文字列を使用したいと思っていました。なぜISO-8859にデコードしていますか? – deceze

+0

その文字列は_really_から来ていますか?ファイルを読み込んだ後、コンテンツをHTMLエンティティにエンコードするように見えますか? @nj_は "_unicode文字はコードポイントで表現されるべきで、個々のUTF-8バイトをエンコードするのではなく、"と書かれていますが、間違って修復しようとしています。 – JosefZ

+0

@deceze実際にUTF-8が欲しいのですが、私は、異なるエンコーディングを使って有効なUTF-8結果(eval.inページはUTF-8である)を得て、 8は誤った発音区別符号を返します。[eval in](https://eval.in/593768)。 –

答えて

2

私は間違っているかもしれませんが、ユニコード文字はコードポイントで表現され、個々のUTF-8バイトをエンコードするのではなく、あなたが持っているものです。したがって、Öは、Öを使用するか、または指定された形式Öを使用して表現するとよいでしょう。

ENT_XML1フラグをhtml_entity_decodeに設定すると、この作業が行われるように見えますが、フードの下で何が行われているかは完全にはわかりません。

preg_replace_callback('/&#x([A-Fa-f0-9]{2});/', function ($m) { 
    return chr(hexdec($m[1])); 
}, $str); 
+0

OPがそこにある非常に壊れたエンコーディングです。明示的な' preg_replace'がこれを処理する唯一の本当の方法でしょう。 – deceze

+0

両方のソリューションが動作します。ありがとう!合意しました。これがエンコードプロセスの間違いであるかどうかを今すぐ確認してください。 –

+0

@deceze私はそれに同意します。私は現在、これがソース文字列のエラーであるかどうかもチェックしています。このソリューションは動作しますが、 –

関連する問題