Unicode の16進数の実体参照を正規表現などで元に戻す
2008-05-10-3
[Programming]
普段は適切に処理をされてて問題にならないんだけど、
ときどきひょんな局面で出会ってしまうのが、
"�" という形式の文字列、16進数の実体参照です。
Perl でデコードする方法をメモ。
pack と Encode::decode を使うと良いみたい。
追記080511: miyagawa さんに正解を教えて頂きました。
ありがとうございます。
ref.
- はてなブックマーク - miyagawaのブックマーク / 2008年05月11日
http://b.hatena.ne.jp/miyagawa/20080511#bookmark-8550074
- 404 Blog Not Found:perl - 文字参照を(en|de)codeする
http://blog.livedoor.jp/dankogai/archives/51048882.html
追記080512:
実体参照ではなく文字数値参照であるとの指摘を受けました。
ありがとうございます。ということで、申し訳ございませんが、
上記の内容は s/実体参照/文字数値参照/g で読んでください。
追記080512: 追記その2。
文字数値参照ではなく数値文字参照でした。ご指摘ありがとうございます。
上記の内容は s/実体参照/数値文字参照/g で読んでください。
ときどきひょんな局面で出会ってしまうのが、
"�" という形式の文字列、16進数の実体参照です。
Perl でデコードする方法をメモ。
pack と Encode::decode を使うと良いみたい。
#!/usr/bin/perl use strict; use warnings; use Encode; use utf8; binmode STDOUT, ":utf8"; my $a = "情報時代"; $a =~ s/&#x([0-9A-F]{4});/decode('UCS2', pack('H*', $1))/ge; print "$a\n";
追記080511: miyagawa さんに正解を教えて頂きました。
ありがとうございます。
正規表現の場合は chr と hex。my $a = "情報時代"; use HTML::Entities; print HTML::Entities::decode($a), "\n";
dankogai さんの記事もご参照ください。my $a = "情報時代"; $a =~ s/&#x([0-9A-F]{4});/chr(hex($1))/ge; print "$a\n";
ref.
- はてなブックマーク - miyagawaのブックマーク / 2008年05月11日
http://b.hatena.ne.jp/miyagawa/20080511#bookmark-8550074
- 404 Blog Not Found:perl - 文字参照を(en|de)codeする
http://blog.livedoor.jp/dankogai/archives/51048882.html
追記080512:
実体参照ではなく文字数値参照であるとの指摘を受けました。
ありがとうございます。ということで、申し訳ございませんが、
上記の内容は s/実体参照/文字数値参照/g で読んでください。
追記080512: 追記その2。
文字数値参照ではなく数値文字参照でした。ご指摘ありがとうございます。
上記の内容は s/実体参照/数値文字参照/g で読んでください。
この記事に言及しているこのブログ内の記事