UTF-8 の全角ハイフンが Perl の正規表現にマッチしなくて悩んだ
2008-05-01-3
[Programming]
UTF-8 の全角ハイフン(便宜上こう呼びます)を
Perl の正規表現でマッチさせようとしてはまりました。
全角ハイフンってのは「−」です。
やろうとしたことは、テキストファイル(UTF-8)を読み込んで、
その中の全角ハイフンを半角ハイフンに変換するという作業。
Perl スクリプトはこんな感じ。
出力「12-234-5」を想定。
しかし一部の全角ハイフンだけが半角に変換されるだけで、
残りはそのままでした。困った、困った。
で、元のテキストファイルの全角ハイフンを「od -t x1」
で見てみると「ef bc 8d」と「e2 88 92」の2種類が混じっていました。
前者は「\p{Hyphen}」にマッチするのですが後者はダメ。
まあ原因は分かったので、前処理でバイナリ置換して解決しました。
まあ、このあたりって Unicode がらみでは常識なんでしょうね。
もっと研鑽せねば。
追記080501: Perl で文字コードと言えば弾さん。
さっそく解決策を頂きました。ありがとうございます!
- 404 Blog Not Found:Unicode - 似た文字同士にご用心
http://blog.livedoor.jp/dankogai/archives/51043693.html
unicore をあさる技、活用します。
■小飼弾のアルファギークに逢って来た
(ref. [2008-04-15-1])
Perl の正規表現でマッチさせようとしてはまりました。
全角ハイフンってのは「−」です。
やろうとしたことは、テキストファイル(UTF-8)を読み込んで、
その中の全角ハイフンを半角ハイフンに変換するという作業。
Perl スクリプトはこんな感じ。
入力「12−234−5」に対して、use utf8; use open ':utf8'; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; while (<>) { s/\p{Hyphen}/-/g; # または s/−/-/g; print; }
出力「12-234-5」を想定。
しかし一部の全角ハイフンだけが半角に変換されるだけで、
残りはそのままでした。困った、困った。
で、元のテキストファイルの全角ハイフンを「od -t x1」
で見てみると「ef bc 8d」と「e2 88 92」の2種類が混じっていました。
前者は「\p{Hyphen}」にマッチするのですが後者はダメ。
まあ原因は分かったので、前処理でバイナリ置換して解決しました。
まあ、このあたりって Unicode がらみでは常識なんでしょうね。
もっと研鑽せねば。
追記080501: Perl で文字コードと言えば弾さん。
さっそく解決策を頂きました。ありがとうございます!
- 404 Blog Not Found:Unicode - 似た文字同士にご用心
http://blog.livedoor.jp/dankogai/archives/51043693.html
unicore をあさる技、活用します。
■小飼弾のアルファギークに逢って来た
(ref. [2008-04-15-1])
この記事に言及しているこのブログ内の記事