2014/11/08

CPAN モジュールで一行 abstract に UTF-8 書いた場合の Build.PL

CPAN モジュールで一行 abstract に UTF-8

CPAN モジュールを書いた時に、POD にマルチバイト書いた場合とか、=encoding UTF-8 したりすると思いますが、=head1 NAME の中で一行説明文を UTF-8 で書いた場合は、Module::Build で自動生成される META.json や META.yml 内の abstract 項目が文字化けてしまう。

=head1 NAME

Acme::EnclosedChar - Ⓔⓝⓒⓛⓞⓢⓔⓓ Ⓐⓛⓟⓗⓐⓝⓤⓜⓔⓡⓘⓒⓢ Ⓔⓝⓒⓞⓓⓔⓡ

上のような POD から META.json が生成されて、以下のように化けてしまった。

{
   "abstract" : "Ⓔⓝⓒⓛⓞⓢⓔⓓ Ⓐⓛⓟⓗⓐⓝⓤⓜⓔⓡⓘⓒⓢ Ⓔⓝⓒⓞⓓⓔⓡ",
   "author" : [
      "Dai Okabayashi <bayashi@cpan.org>"
   ],
   "dynamic_config" : 1,

対応

最初 手で直せばいいのかなと思ってやってみたけど make dist するとダメだった。どうすんだっけと思っていたら @kentfredric さんからパッチが送られて来て事なきを得た。

in Build.PL

my $abstract = 'Ⓔⓝⓒⓛⓞⓢⓔⓓ Ⓐⓛⓟⓗⓐⓝⓤⓜⓔⓡⓘⓒⓢ Ⓔⓝⓒⓞⓓⓔⓡ';
if ( $] > 5.008001 ) {
 utf8::decode($abstract);
} else {
 $abstract ='Enclosed Alphanumerics Encoder';
}

Build.PL にハードコーディング

Build.PL で `use utf8' すると良さそうだけど、Perl のバージョンを見てハードコーディングしちゃった方がポータブルらしい、という対応で dist_abstract は自動生成に任せてたんだけど、まあ編集することもないし。

というわけで、

モジュールの一行説明文に UTF-8 とか書いてみたモジュールは以下のようなものです。

Acme::EnclosedChar

use Acme::EnclosedChar qw/enclose_all/;

Print enclose_all('Perl'); # Ⓟⓔⓡⓛ

フォントはよしなに。

ⓎⒶⓅⒸ は㋶㋜㋣みたいだけど、Ⓐⓒⓜⓔ大全は Ⓕⓞⓡⓔⓥⓔⓡ!

サイト内検索