1. ホーム
  2. php

[解決済み] エンコーディングを検出し、すべてをUTF-8にする。

2022-02-16 10:02:50

質問

様々な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;
}

テストしてみましたが、うまくいきません。どこが悪いのでしょうか?

解決方法を教えてください。

を適用した場合 utf8_encode() をすでにUTF-8の文字列に変換すると、文字化けした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() .