mumumuの日記: HTML Numeric character references 2
http://www.w3.org/TR/html401/charset.html#h-5.3.1
HTML中では、数値文字参照という形で、文字を表す
ために「&#」に続けてUnicodeのコードポイントを
挿入することが許されている。Webページや果てはRSS
においてさえ、これが挿入されているケースが存在し
ている。身近なところでの良い例はEngadget Japanese
があげられるだろう。
巷では、日本語の文字列をこの数値文字参照に変換す
るケースは結構存在している。しかし、rss2imap等で
は、この逆の処理、つまり数値文字参照を文字に変換
する処理が必要である。
----
perl -MEncode -p -i -e '
s/\&#(x)?([a-f0-9]{1,5});/
my $tmpstr = ($1)
? pack( "H*", sprintf( "%08s", "$2" ) )
: pack( "N*", $2 );
Encode::encode( "iso-2022-jp",
Encode::decode( "UTF-32BE", $tmpstr )
);
/eig;
' < engadget.xml
----
としたら思い通りにできた。HTMLの数値文字参照は、
Unicodeのコードポイントを10進数または16進数で表
現したものに過ぎない。それを32ビットのバイナリに
直せば UTF-32BE(LE)となる。あとはEncodeを通せば変
換し放題、というわけだ。
[ Update August 12th 6:30 JST by m ]
UTF-32BEに変換し、Encodeを使う方向で全面的に
修正。 御協力頂いたumqさめ、及び某チャンネルの
方々に感謝しますm(_ _)m
数値文字参照 (スコア:1)
でいけるはず。
Masafumi Otsune [otsune.com]
Re:数値文字参照 (スコア:1)
おつね支障ありがちょーどすm(_ _)m
但し、元エントリは HTML::Entities を使わないことを念頭に置い
て書いたものです。rss2imap では、出来うる限り使用するモジュ
ールは増やさない、というポリシーの元で書いていたので。
# 無精、短気、傲慢、これ最強