Perl + UTF-8 で半角円記号を出力する

概要

Perl で半角円記号を Slack に出力させる際に少しハマったので、その原因と解決策について書きました。

結論としては encode_utf8("\x{a5}")encode('utf8', "\x{a5}") で出力できます。

f:id:yuu2634:20180110003147p:plain


バックスラッシュ問題

歴史的背景から、日本語キーボードで ¥ を入力した場合は 0x5C として扱われます。

この 0x5C が非常に厄介で、日本で使われてきた文字コード *1 では円記号を表しますが、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 で半角円記号を出力しました
  • 日本語環境の円記号とバックスラッシュには深い関係があります
  • 文字コードを直接指定して回避しましょう

*1:JIS X 0201