エンコーディングを検出し、すべてをUTF-8にする 質問する

エンコーディングを検出し、すべてをUTF-8にする 質問する

さまざまな RSS フィードから大量のテキストを読み取り、データベースに挿入しています。

もちろん、フィードでは UTF-8 や ISO 8859-1 など、いくつかの異なる文字エンコーディングが使用されます。

残念ながら、テキストのエンコードに問題が発生することがあります。例:

  1. 「Fußball」の「ß」は、私のデータベースでは「Ÿ」のようになります。「Ÿ」であれば、正しく表示されます。

  2. 時々、「Fußball」の「ß」が私のデータベースでは「ß」のように見えます。もちろん、その場合は間違って表示されます。

  3. 他の場合には、「ß」は「ß」として保存されるため、変更されません。その場合も誤って表示されます。

ケース 2 と 3 を回避するにはどうすればよいでしょうか?

すべてを同じエンコーディング (できれば UTF-8) にするにはどうすればよいでしょうか? いつ を使用する必要がありutf8_encode()、いつ を使用する必要がありutf8_decode()(効果は明ら​​かですが、いつ 関数を使用する必要がありますか?)、いつ入力に対して何もしなくてもよいのでしょうか?

すべてを同じエンコーディングにするにはどうすればいいでしょうか? おそらく関数を使うのでしょうかmb_detect_encoding()? このための関数を書くことはできますか? 私の問題は次のとおりです:

  1. テキストがどのエンコーディングを使用しているかを確認するにはどうすればよいですか?
  2. 古いエンコードが何であれ、それを UTF-8 に変換するにはどうすればよいでしょうか?

このような機能は動作するでしょうか?

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

テストしましたが、動作しません。何が問題なのでしょうか?

ベストアンサー1

すでに UTF-8 の文字列に適用するとutf8_encode()、文字化けした UTF-8 出力が返されます。

私はこれらすべての問題に対処する関数を作成しました。これは と呼ばれますEncoding::toUTF8()

文字列のエンコードが何であるかを知る必要はありません。Latin1(ISO 8859-1)Windows-1252または UTF-8、または文字列にそれらの組み合わせを含めることができます。Encoding::toUTF8()すべてを UTF-8 に変換します。

あるサービスが UTF-8 と Latin1 を同じ文字列に混在させためちゃくちゃなデータ フィードを提供していたため、これを実行しました。

使用法:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

ダウンロード:

https://github.com/neitanod/forceutf8

Encoding::fixUFT8()文字化けしたように見えるすべての UTF-8 文字列を修正する別の関数 も追加しました。

使用法:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

例:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

出力は次のようになります:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

関数 ( forceUTF8) を というクラスの静的関数ファミリーに変換しましたEncoding。新しい関数は ですEncoding::toUTF8()

おすすめ記事