ちょっと前に、MacのPerlの環境を本気出して整えると言う記事を投稿した。
これは、その前日に投稿した「ものかのさんを囲んでUnicode正規化について聞く会」という飲み会において、PerlはUTF-8-MACというEncodingをサポートしているか、と聞かれたことに端を発する。
これは、その前日に投稿した「ものかのさんを囲んでUnicode正規化について聞く会」という飲み会において、PerlはUTF-8-MACというEncodingをサポートしているか、と聞かれたことに端を発する。
この問題は、ものかのさんのブログで以下のように問題提起されている。
UTF-8-MAC なんていう文字コードはありません
UTF-8-MAC は文字コードかな…
先日インストールしたばかりのPerl 5.18.0が、UTF-8-MACというEncodingをサポートしているかについては、幸いすぐに答えが出る。
以下のコードを実行すれば良い。
実行結果は以下のようである。
UTF-8-MACというのはない。
しかし、それどころか、UTF-8もない。
utf8はある。
ASCII、Shift_JIS(IANA登録名)もない。
ascii、shiftjisはある。
これはどういうことだろうか。
Dan Kogai > Encode > Encode::Supported(CPAN)によると、こういうことらしい。
・この名前はカノニカル(canonical 正典の)名である。
・カノニカル名は以下の順番でつけられる。
*Perlコミュニティで使われていた名前(utf8など)
*IFTF RFCで定められたMime名
*IANA登録名
*それを定義した組織による命名(MacJapaneseなど)
・その他の名前はエイリアス(Alias 別名)として定められている。
では、あるエイリアスについて、そのカノニカル名を見出すことは出来るだろうか。
以下のようにすればいいようだ。
実行してみる。
予想通り、以下のようになっている。
エイリアス カノニカル名
--------------------
UTF-8 utf-8-strict
Shift_JIS shiftjis
UTF-8-MAC 未定義(Perlでエラーになる)
ということで、エイリアスとしても、カノニカル名としても、初期状態のPerlにはUTF-8-MACが「ない」ということが分かった。
#Perlのutf8とutf-8-strictの違いはそのうち調べる
ではなぜPerlに「ある」という話が出たかというと、それは「ないと困る」のでtomi-ruさんによってCPANモジュールに登録されているからだろう。
Encode::UTF8Mac(tomi-ruの日記)
Naoki Tomita (tomi-ru) > Encode-UTF8Mac-0.03 > Encode::UTF8Mac(CPAN)
つまり、CPANからダウンロードしてインストールすると使えるけど、現状ではcoreに入っていない状態だ。
では、あるとどういう風に便利なのだろうか。
それはまた来週ううう~~~(ヘナヘナヘナ~~)
★
追記。
上のことを調べていて知ったのだが、上のEncode::find_encoding(エンコード名)というメソッドが返すのは、与えられたエンコード名(エイリアスかカノニカル名)をPerlのutf8内部文字列に変換する変換器(オブジェクト)だそうだ。
Perlで連続的に文字コードを変換するとき、読み込むたびにエイリアス/カノニカル名の名前解決を行うと遅くなるので、最初にfind_encodingを使ってオブジェクトを作っておいて、その後はオブジェクトを使って変換すると速いらしい。
perl tips - Encodeを速く使う方法(404 blog not found)
もっとも、外部ファイルから読み込むときは、binmode関数やopen関数の第2引数でエンコードを指定するので、いちいちencodeやfrom_toを呼び出すことはない。
UTF-8-MAC なんていう文字コードはありません
UTF-8-MAC は文字コードかな…
先日インストールしたばかりのPerl 5.18.0が、UTF-8-MACというEncodingをサポートしているかについては、幸いすぐに答えが出る。
以下のコードを実行すれば良い。
#! /usr/bin/perl
# encode_list.pl --サポートされているエンコードを一覧表示
use 5.10.0;
use Encode;
say join " ", sort Encode->encodings(":all"); # エンコードの一覧を配列に格納
print "\n";
実行結果は以下のようである。
7bit-jis AdobeStandardEncoding AdobeSymbol AdobeZdingbat MIME-B MIME-Header MIME-Header-ISO_2022_JP MIME-Q MacArabic MacCentralEurRoman MacChineseSimp MacChineseTrad MacCroatian MacCyrillic MacDingbats MacFarsi MacGreek MacHebrew MacIcelandic MacJapanese MacKorean MacRoman MacRomanian MacRumanian MacSami MacSymbol MacThai MacTurkish MacUkrainian UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE UTF-7 ascii ascii-ctrl big5-eten big5-hkscs cp1006 cp1026 cp1047 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp37 cp424 cp437 cp500 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp858 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp875 cp932 cp936 cp949 cp950 dingbats euc-cn euc-jp euc-kr gb12345-raw gb2312-raw gsm0338 hp-roman8 hz iso-2022-jp iso-2022-jp-1 iso-2022-kr iso-8859-1 iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14 iso-8859-15 iso-8859-16 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 iso-8859-8 iso-8859-9 iso-ir-165 jis0201-raw jis0208-raw jis0212-raw johab koi8-f koi8-r koi8-u ksc5601-raw nextstep null posix-bc shiftjis symbol utf-8-strict utf8 viscii
UTF-8-MACというのはない。
しかし、それどころか、UTF-8もない。
utf8はある。
ASCII、Shift_JIS(IANA登録名)もない。
ascii、shiftjisはある。
これはどういうことだろうか。
Dan Kogai > Encode > Encode::Supported(CPAN)によると、こういうことらしい。
・この名前はカノニカル(canonical 正典の)名である。
・カノニカル名は以下の順番でつけられる。
*Perlコミュニティで使われていた名前(utf8など)
*IFTF RFCで定められたMime名
*IANA登録名
*それを定義した組織による命名(MacJapaneseなど)
・その他の名前はエイリアス(Alias 別名)として定められている。
では、あるエイリアスについて、そのカノニカル名を見出すことは出来るだろうか。
以下のようにすればいいようだ。
#! /usr/bin/perl
# encalias.pl -- find canonical name for a Encode alias
use 5.10.0;
use Encode;
say find_encoding(shift)->name;
実行してみる。
予想通り、以下のようになっている。
エイリアス カノニカル名
--------------------
UTF-8 utf-8-strict
Shift_JIS shiftjis
UTF-8-MAC 未定義(Perlでエラーになる)
ということで、エイリアスとしても、カノニカル名としても、初期状態のPerlにはUTF-8-MACが「ない」ということが分かった。
#Perlのutf8とutf-8-strictの違いはそのうち調べる
ではなぜPerlに「ある」という話が出たかというと、それは「ないと困る」のでtomi-ruさんによってCPANモジュールに登録されているからだろう。
Encode::UTF8Mac(tomi-ruの日記)
Naoki Tomita (tomi-ru) > Encode-UTF8Mac-0.03 > Encode::UTF8Mac(CPAN)
つまり、CPANからダウンロードしてインストールすると使えるけど、現状ではcoreに入っていない状態だ。
では、あるとどういう風に便利なのだろうか。
それはまた来週ううう~~~(ヘナヘナヘナ~~)
★
追記。
上のことを調べていて知ったのだが、上のEncode::find_encoding(エンコード名)というメソッドが返すのは、与えられたエンコード名(エイリアスかカノニカル名)をPerlのutf8内部文字列に変換する変換器(オブジェクト)だそうだ。
Perlで連続的に文字コードを変換するとき、読み込むたびにエイリアス/カノニカル名の名前解決を行うと遅くなるので、最初にfind_encodingを使ってオブジェクトを作っておいて、その後はオブジェクトを使って変換すると速いらしい。
perl tips - Encodeを速く使う方法(404 blog not found)
もっとも、外部ファイルから読み込むときは、binmode関数やopen関数の第2引数でエンコードを指定するので、いちいちencodeやfrom_toを呼び出すことはない。