4

cURL を使用して RSS フィードのリストをスクレイピングし、SimpleXML を使用して RSS データを読み取って解析しています。次に、ソートされたデータが mySQL データベースに挿入されます。

ただし、http://dansays.co.uk/research/MNA/rss.phpに記載されているように、文字が正しく表示されないという問題がいくつかあります。

例:

âGuitar Hero: Van Halenâ Trailer And Tracklist Available

NV 10/10/09 – Salt Lake City, UT 10/11/09 – Denver, CO 10/13/09 –

データベースに挿入する前に、データに htmlentities と htmlspecialchars を使用してみましたが、問題の解決には役立たないようです。

私が抱えているこの問題をどのように解決できますか?

アドバイスをありがとう。

更新しました

グレッグが提案したことを試しましたが、問題はまだここにあります...

PDOでSET NAMESを実行するために使用したコードは次のとおりです。

$dbh = new PDO($dbstring, $username, $password); 

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$dbh->query('SET NAMES "utf8"');

simplexml データを並べ替えてデータベースに挿入する前に、少しエコーを行いましたが、cURL と関係があると思います...

ここに私がcURLのために持っているものがあります:

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');

$data = curl_exec($ch);

curl_close($ch);

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

問題は解決された

この問題を解決するには、RSS/HTML ページのコンテンツ文字セットを「UTF-8」に設定する必要がありました。char の問題がまだ生データに残っているため、これは本当の修正ではないと思います。PHP6 で適切にサポートされることを楽しみにしています!

4

4 に答える 4

3

CURLOPT_ENCODINGについて簡単に説明します。これはAccept-Encodingヘッダーであり、文字エンコーディングとはまったく異なります。サポートされている受け入れエンコーディングは、「identity」、「deflate」、および「gzip」です。

于 2012-01-03T12:25:27.913 に答える
3

あなたのページは UTF-8 で提供されているので、データベースを指さしたいと思います。

MySQL では、SELECT または INSERTS の前に接続が UTF-8 であることを確認してください。

SET NAMES "utf8"
于 2009-08-11T15:06:08.980 に答える
2

すべてのデバッグと同様に、問題を特定することから始めます。

cURL を使用して RSS フィードのリストをスクレイピングしています。問題を引き起こしている RSS フィードの xml を見てください (複数のフィードがあるため、一部のフィードが正しく、間違ったフィードが存在する可能性があります)。いろいろな意味で間違っている)

次に、SimpleXML を使用して RSS データを読み取り、解析しています。- SimpleXML が読み取ったフィールドを出力します - 大丈夫ですか、それとも問題が発生していますか?

次に、ソートされたデータが mySQL データベースに挿入されます。- 問題を引き起こしているデータの hex(field)、length(field)、および char_length(field) を出力します。

編集

フィードhttp://hangout.altsounds.com/external.php?type=RSS2を取得し、バリデーターhttp://validator.w3.org/feed/に入れます。彼らはコンテンツ タイプを iso-8859-1 として宣言していますが、引用符などの実際のコンテンツの一部は cp1252 のようなものです。たとえば、バイト 0x93 を使用して左の引用符を表しています - http:// www.fileformat.info/info/unicode/char/201C/charset_support.htm .

これについて厄介なことは、これが一部のツールで表示されないことです.Firefoxは何が起こっているのかを推測し、引用符を正しく表示しているようです.さらに言えば、SimpleXMLは0x93をutf8に変換するため、0xc293として出力されます.問題を悪化させます。

編集2

そのフィードをもう少し正確に読み取るための回避策は、Simple XML に渡す前に「ISO-8859-1」を「Windows-1252」に置き換えることです。フィードの一部が UTF8 であることが判明したため、100% は機能しません。

世界中のすべての人にフィードを修正してもらうことはできないと仮定すると、一般的なアプローチは、不正なデータを送信している外部システムとのインターフェースに必要な回避策を分離し、純粋なクリア utf8 をハブに渡すことです。あなたのシステムの。生の外部フィードの日付付きコピーを保存して、回避策が必要な理由を後で思い出すことができるようにします。回避策を実装するコード行を切り離してコメントすることで、外部組織がフィードを修正した場合に簡単にアクセスして変更できるようにします (または別の方法でそれを壊します)、時々もう一度確認してください。残念ながら、仕様に合わせてプログラミングするのではなく、バグの現在の状態に合わせてプログラミングしているため、恒久的でクリーンな解決策はありません。できる最善の方法は、分離、文書化、監視することです。

于 2009-08-11T16:06:07.050 に答える
1

リンク先の特定のフィードでは、次のような XML プロローグに関係している可能性があります。

<?xml version="1.0" encoding="ISO-8859-1" ?>

私が知る限り、SimpleXML のベースとなっている libxml は、この種のものを探します。XML ファイルについてはわかりませんが、HTML 文字列を使用METAすると、文字セットを指定する要素が検索されることは確かです。

XML のプロローグを削除してみてください (私は HTML タグを削除することで同様の問題を一度解決しました)、 SimpleXMLElement にデータを渡す前にMETA忘れないようにしてください。utf8_encode()

于 2009-08-11T16:50:34.947 に答える