スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

エンティティ文字

BlogPad」はVectorRSSナビさんなどで公開していただいている、私作のいわゆるRSS/ATOMリーダである。

この夏休み、ガッデムさんのブログを「BlogPad」に登録しようとしたら、文字が化け化けになって登録できないことが判明。

なんでじゃぁ・・と追求していくと、どうやら「エンティティ文字」といわれる、文字コード関係の所で問題が生じていることが判明。

エンティティ文字は例えば「<」(全角で書いてるけどほんとは半角)であれば「<」、「”」であれば「"」などとhtmlやxmlの中で表現する手法である。なんでそんなことをする必要があるかどうかはググって調べましょう(ちょっと酔ってるのでうまく書けねぇ・・が、基本的な考え方として、通信に使う文字列はASCIIの範囲内、つまり7bitで表現しましょうってのがあると思う・・メールとかの送受信は基本的にそうなってる、過去のコンピュータコミュミケーションの遺物というか互換のためですな)。

これ以外にも例えば「>」なんで表現もあって、これは「<」とおんなじである。意味としては062はasciiの文字コードを文字列として表現したものになってる。ちなみに16進数で「>」としても同じ意味となる。「x」がつくんですな16進の場合。

さて上記のガッデムさんのブログ、RSS1.0とRSS2.0でフィード情報が提供されているのだけど、取ってきた素のRSSのデータを見ると、日本語の部分が「�」みたいにエンティティ化されている。簡単に言うと数値でエンティティ化されているものは、バイナリーデータを文字コードに置き換えたものなので、文字コードをバイナリーに変換してやれば元に戻る。

BlogPadはこの手のエンティティ化された文字列にも対応できるように一応作ってたつもりである。が、今回これが効いてない。

ちょいと調べて見ると、配信されているRSSのXML記述上は「utf-8」でエンコードされているが、エンティティ化されている部分は「utf-16(LE)」になってる。

BlogPadは最初にまずエンティティ化されているところをバイナリーデータに変換して、xmlタグを解析する。解析途中でxmlデータのエンコード方式を拾って、それに従ってエンコードされた文字を「winunicode」・・つまりUNICODEに変換する。

この場合、utf-8とエンコード方式が出てるので、utf-8からUNICODEに変換していくのだけど、エンティティ文字については実はutf-16なので、utf-16をutf-8と解釈してUNICODE変換するのでおかしな事になっていること・・までは分かった。

解決方法は、エンティティ文字の変換はタグ解析の後に持ってくることだ。

なんだけど、実はそれをすると他のところで問題が起きる。具体的にはYahoo! USとかなのだけど、タグ表現の「<」自身をエンティティ化しているところがあるので、最初にエンティティ文字をバイナリーに変換しないと、タグ解析がおかしなことになるのだ。

長々と書いたけど、解決に時間がかかりそう・・しかしブラウザーとかはちゃんとガッデムさんのところのRSSを変換してる。ってことは俺のエンティティ文字とかXMLパーサーのありかたに関する解釈が間違ってるのかもしれない・・というかあるべき姿を誰か教えてください(調べてもようわからんかった)

コメントの投稿

非公開コメント

プロフィール

N-Soft

Author:N-Soft
最近の記事
カテゴリー
最近のコメント
リンク
RSSフィード
カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。