0

他の多くのPHP開発者が文字エンコードで問題を抱えているように、質問では、データがUTF8として保存および出力されるようにするための手順の概要を説明します。他に何を考慮すべきか、または現在の考え方で変更すべきかについてアドバイスをお願いします。

DEFAULT CHARACTER UTF-8私のテーブルには次の照合があるmysqlデータベースがありますutf8_general_ci

私はphpスクリプトを使用してRSSフィードからデータを読み取り、そのデータをデータベースごとに保存しています。そのデータを保存する前に、次の手順を実行して、そのデータがUTF-8であるかどうかを確認します。

protected function _convertToUTF8($content) {
    $enc = mb_detect_encoding($content);
    return mb_convert_encoding($content, "UTF-8", $enc);
}

このデータをウェブページに出力するとき、私はphpでヘッダーを設定しました

header("Content-type: text/html; charset=utf-8");

また、Content-Typeメタタグをutf-8に設定しました

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

これまでのところ、すべてが期待どおりに機能し、面白い文字が出力されず、すべてがスムーズに進んでいますが、このデータを処理するときに他に何かを変更/検討する必要がありますか?

私が今抱えている問題は、このデータをtxtファイル(csv)に出力することです。ファイルを正常に作成したfwrite()を使用していますが、このファイルを渡すサードパーティは、ファイルがUTF-8ではないと言っています。データがUTF-8として出力されているかどうかわかりませんが、どうすれば確認できますか?SSH経由でリモートサーバーにログインし、取得Itâs aしたファイルをvimしたときに取得したファイルを、取得Itâ~@~Ysしたファイルを減らしたときに取得した場合It<E2><80><99>sここで何が欠けていますか?

前もって感謝します!

4

2 に答える 2

4

データのエンコードを検出することはできません。エンコーディングは常にデータ自体の隣のメタ情報です。

最善を尽くしてもmb_detect_encoding()、データを自動的に処理するために使用しないでください。データ自体からエンコーディングを検出することはできないため、この関数も同様に検出できません。

それに頼らないでください。問題をデバッグする必要がある場合、またはフォールバックの最後の手段である場合の手動検査にのみ使用してください。ただし、標準のデータ処理では使用しないでください。それでも、その情報をあまり信用しないでください。

どうすればそう言えますか?単なる例:テキストは有効にUS-ASCIIでエンコードでき、UTF-8の検出ルーチンはそれが有効なUTF-8でエンコードされていることを返します。そして、それはほんの一例です。真実は、これははるかに複雑です。

したがって、生データからエンコーディングを検出できないことは当然のことと考えてください。

代わりに、エンコーディングを指定するメタ情報を探してください。エンコーディング情報が指定されていない場合は、データの転送について仕様書でデフォルトのエンコーディングを検索してください。

RSSフィードからのデータを保存する場合は、応答ヘッダーまたはXMLプロローグのいずれかで情報を検索します。通常、ドキュメントのISO表記のエンコーディングが含まれています。

データベースはUTF-8としてエンコードされたデータを想定しているため、処理ではUTF-8データのみがデータベースに格納されるように注意する必要があります。したがって、データのエンコーディングを確認して取得してから、エンコーディングを変更するために必要な手順を実行します。mb_detect_encoding()ただし、これらの手順の実行に依存しないでください。

于 2011-06-13T22:50:39.603 に答える
0

結局、外部アプリケーションがファイルを正しく読み取るために必要なのはBOMでした。

于 2011-06-29T19:39:06.397 に答える