PHPでUTF8の検出、保存、出力
-
27-10-2019 - |
質問
私は、他の多くのPHP開発者が文字エンコードに問題を抱えているように、質問は私のデータがUTF8として保存され出力されるようにするための手順の概要を説明します。現在の考え方で、他に何を考慮すべきか、または変更するべきであることについてアドバイスをお願いします。
MySQLデータベースがあります DEFAULT CHARACTER UTF-8
私のテーブルには照合があります utf8_general_ci
PHPスクリプトを使用して、RSSフィードのデータを読み取り、そのデータをデータベースごとに保存しています。そのデータを保存する前に、次のことを行うことにより、そのデータがUTF-8かどうかを確認してください。
protected function _convertToUTF8($content) {
$enc = mb_detect_encoding($content);
return mb_convert_encoding($content, "UTF-8", $enc);
}
このデータをWebページに出力するとき、私はPHPでヘッダーを設定します
header("Content-type: text/html; charset=utf-8");
また、コンテンツタイプのメタタグをUTF-8に設定します
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
これまでのところ、すべてが期待どおりに機能します私は面白いキャラクターが出力されず、すべてがスムーズに進んでいますが、このデータを扱うときに他の何かを変更/検討する必要がありますか?
私が現在抱えている問題は、このデータをTXTファイル(CSV)に出力することです。FWRITE()を使用してファイルを正常に作成しましたが、このファイルを渡しているサードパーティは、ファイルがUTF-8ではないと書かれています。 データがUTF-8として出力されているかどうかはわかりません, 、どうすればこれを確認できますか? SSHを介してリモートサーバーにログインしたとき、私は私が取得したファイルを猫にします Itâs a
ファイルを入手するとき Itâ~@~Ys
ファイルが少ないとき It<E2><80><99>s
. ここに何が欠けていますか?
前もって感謝します!
解決 2
最終的には、外部アプリケーションがファイルを適切に読み取るために必要なBOMでした。
他のヒント
データのエンコードを検出することはできません。 エンコーディングは、常にデータ自体の横にあるメタ情報です。
平 mb_detect_encoding()
そうすることが最善であり、データを自動的に処理するために使用しないでください。データ自体からエンコードを検出することは不可能なため、この機能も同様にできません。
それに頼らないでください。問題をデバッグする必要がある場合や、フォールバックの最後の手段では、手動検査にのみ使用しますが、標準的なデータ処理ではありません。それでも、その情報をあまり信用しないでください。
どうすればそう言うことができますか?例:テキストを有効にUS-ASCIIエンコードすることができ、UTF-8の検出ルーチンは、有効なUTF-8エンコードであることを返します。そして、それはほんの一例です。真実は、これははるかに複雑です。
したがって、生データからエンコードを検出できないことを当然と考えてください。
代わりに、エンコードを指定するメタ情報を探します。エンコーディング情報が提供されていない場合は、データの輸送のための仕様ドキュメントのデフォルトエンコードを検索します。
RSSフィードからデータを保存する場合、応答ヘッダーおよび/またはXMLプロローグのいずれかで情報を検索します。通常、ドキュメントのISO表記でエンコードが含まれています。
データベースは、UTF-8としてエンコードされたデータを予想しているため、処理はUTF-8データのみがデータベースに配置されるように注意する必要があります。したがって、データのエンコードを確認して取得し、エンコードを変更するために必要な手順を実行します。しかし、頼らないでください mb_detect_encoding()
これらの手順を実行します。