erl-creole: ユニコード文字列とマルチバイト列の変換ライブラリ

少し必要になったのでErlangユニコード文字列と各種エンコーディングのマルチバイト列(バイナリ)の相互変換を行うモジュールを作成した。
github: erl-creole-0.0.1


現状、対応しているエンコーディングは以下の通り*1:

使用例

%% 入力文字列
> S = "Unicode (ユニコード) とは、世界中の多くのコンピュータ上の文字列を一貫した方法で符号化し、表現し、扱うためのコンピュータ業界の標準である。".

%% EUC-JPに変換
> creole:from_string(S, eucjp).
<<"Unicode (\&#230;\&#203;\&#179;&#161;&#188;\&#201;) &#164;&#200;&#164;&#207;&#161;¢&#192;&#164;&#179;釗&#195;&#230;&#164;&#206;&#194;&#191;&#164;&#175;&#164;&#206;\&#179;\&#243;\&#212;\&#229;&#161;&#188;\&#191;&#190;&#229;&#164;&#206;&#202;&#184;&#187;&#250;&#206;&#243;&#164;&#242;°&#236;´&#211;&#164;&#183;&#164;&#191;&#202;&#253;&#203;&#161;&#164;&#199;&#201;&#228;&#185;&#230;&#178;&#189;&#164;&#183;&#161;¢&#201;&#189;&#184;&#189;&#164;&#183;&#161;¢°&#183;&#164;釗&#164;&#191;&#164;&#225;&#164;&#206;\&#179;\&#243;\&#212;\&#229;&#161;"...>>

%% JIS(ISO-2022-JP)に変換
> Bin = creole:from_string(S, jis).
<<"Unicode (\e$B%f%K%3!<%I\e(B) \e$B$H$O!\"@$3&Cf$NB?$/$N%3%s%T%e!<%?>e$NJ8;zNs$r0l4S$7$?J}K!$GId9f2=$7!\"I=8=$7!\"07$&$?$a$N"...>>

%% バイト列からユニコード文字列に変換
> creole:to_string(Bin, jis).
[85,110,105,99,111,100,101,32,40,12518,12491,12467,12540,
 12489,41,32,12392,12399,12289,19990,30028,20013,12398,22810,
 12367,12398,12467,12531,12500|...]

> io:format("~ts~n", [creole:to_string(Bin, jis)]).
Unicode (ユニコード) とは、世界中の多くのコンピュータ上の文字列を一貫した方法で符号化し、表現し、扱うためのコンピュータ業界の標準である。
ok

%% 変換不能なバイト列がある場合は、デフォルトでは "?" が代わりに使用される
> io:format("~ts~n", [creole:to_string(<<"Unicode (\e$B%~^s^sjaf*(asf7aK%3!<%I">>, jis)]).
Unicode (??潁潁裃罟?癈羞疔コード
ok

%% "?"の代わりに"_"を使用
> io:format("~ts~n", [creole:to_string(<<"Unicode (\e$B%~^s^sjaf*(asf7aK%3!<%I">>, jis, creole:replace($_))]).
Unicode (__潁潁裃罟_癈羞疔コード
ok

*1:ユニコードと他のエンコーディングのコードポイントの対応は主に http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ を参考にさせてもらった。