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

雑記Tech

Perl で半角円記号を Slack に出力させる際に少しハマったので、原因と解決策について書きました。
結論としては encode_utf8("\x{a5}")encode('utf8', "\x{a5}") で出力できます。

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

バックスラッシュ問題

歴史的背景から、日本語キーボードで ¥ を入力した場合は 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 で半角円記号を出力しました
  • 日本語環境の円記号とバックスラッシュには深い関係があります
  • 文字コードを直接指定して回避しましょう

雑記Tech