Perl + UTF-8 で半角円記号を出力する
Perl で半角円記号を Slack に出力させる際に少しハマったので、原因と解決策について書きました。
結論としては encode_utf8("\x{a5}")
か encode('utf8', "\x{a5}")
で出力できます。
バックスラッシュ問題
歴史的背景から、日本語キーボードで ¥
を入力した場合は 0x5C
として扱われます。
この 0x5C
が非常に厄介で、日本で使われてきた文字コード ((JIS X 0201)) では円記号を表しますが、Unicode ではバックスラッシュを意味しています。
日本語環境から円記号のつもりで入力した ¥(0x5C)
ですが、Slack から見るとバックスラッシュ \(0x5C)
として扱われるわけです。
解決法
Unicode で円記号を表すには 0xA5
を使用します。しかし、前述の通り日本語キーボードでいくら ¥ を叩いても 0xA5 にはなりません。
そこで \x{}
を使い、16進数で指定したコードを UTF-8 でエンコードさせます。
use strict;
use Encode;
my $yen = encode_utf8("\x{a5}");
print $yen . "100"; // 「¥100」と出力される
use Encode;
が必要となるので注意しましょう。
余談
波ダッシュ・全角チルダ にも似た問題があることを知りました。
Twitter で稼働中の @splatoon2_stage でガッツリ使っているので、近いうちに使用文字を見直したいと思います。
まとめ
- Perl で半角円記号を出力しました
- 日本語環境の円記号とバックスラッシュには深い関係があります
- 文字コードを直接指定して回避しましょう
ディスカッション
コメント一覧
まだ、コメントがありません
フォローする
カテゴリー
最近の投稿
ブログについて