◆ iconv のエンコーディング名のエイリアス

iconv の Shift_JIS 系エンコーディング

前回の Shift_JIS 関係を調べたときに iconv も気になったので見てみると Shift_JIS 系の名前が色々ありました
サポートしているエンコーディング一覧は「iconv -l」 で見れます

一覧は見れるのにエイリアスの情報がないのでどれとどれが一緒なのか判断が難しいです
Python のエンコーディングの違いを調べたときのコードがあるのでそれを少し改造して iconv のエンコーディングの違いを調べてみました
ファイルを作って iconv コマンドを呼び出して結果を確認して という地道なものです
Python 内部のときと違ってかなり時間がかかりました

結果は

SHIFT-JIS = SHIFT_JIS = SJIS
SHIFT_JISX0213 = SHIFTJISX0213
CP932 = MS932 = SJIS-WIN = SJIS-OPEN

だいたい予想通りです
iconv の CP932 は MS932 とは別 みたいなことをどこかで見たような気がしたけどそんなことはなかったです
SJIS-OPEN って何?と思いましたが CP932 や SJIS-WIN と一緒みたいですね

ソースを見ると謎が増えた

終わった頃にソース見たほうが早かったかもと思って せっかくだしとソースも見てみると謎が増えました

libiconv の最新版は 1.16 で去年リリースです
これの lib/encodings.def ファイルを見ると

/* DEFENCODING(( name, alias1, ..., ),
xxx,
{ xxx_mbtowc, xxx_flushwc },
{ xxx_wctomb, xxx_reset })

のようにエイリアス定義をすることになっています
ファイルの中から Shift_JIS 系を探すと

DEFENCODING(( "SHIFT_JIS",              /* IANA */
"SHIFT-JIS", /* glibc */
"SJIS", /* JDK 1.1, HP-UX, OSF/1 */
"MS_KANJI", /* IANA */
"csShiftJIS", /* IANA */
),
sjis,
{ sjis_mbtowc, NULL }, { sjis_wctomb, NULL })



DEFENCODING(( "CP932",                  /* glibc */
),
cp932,
{ cp932_mbtowc, NULL }, { cp932_wctomb, NULL })

がありました

MS932 や SJIS-WIN は入っていません
別ファイルかなとも思ったのですが ソースコード全体から grep しても見つからないです
最新版で削除されてるというのも考えづらいので謎です

ググると日本語系のために iconv にパッチを当てるとか書いてる古い記事がありました
パッチが当たってるのかな と思ったものの試した iconv コマンドは日本語用のものとして配布されてるわけではなく標準のパッケージに入ってるものです
これに特殊な日本語用パッチが当てられてるとは思えないですし 公式に取り込まれたのだとすれば 1.16 のソースコードに含まれているはずです

iconv が他にもあるらしい

よくわからない と諦めようとしていたのですが iconv コマンドが含まれてるパッケージや依存パッケージを見ていると gconv とかいうのを見かけました
glibc という別のものの中にも iconv があって そっちを gconv と呼んでるみたいです

glibc は C 言語用のライブラリでしたっけ

単純に libiconv を取り込んでるのかと思いきや別物みたいです
どっちも GNU じゃないの??

とりあえずこっちのソースコードを見てみると iconvdata/gconv-modules ファイルにそれらしいのがありました

#	from			to			module		cost
alias SHIFT-JIS// SJIS//
alias SHIFT_JIS// SJIS//
alias MS_KANJI// SJIS//
alias CSSHIFTJIS// SJIS//
module SJIS// INTERNAL SJIS 1
module INTERNAL SJIS// SJIS 1

# from to module cost
alias WINDOWS-31J// CP932//
alias MS932// CP932//
alias SJIS-OPEN// CP932//
alias SJIS-WIN// CP932//
alias CSWINDOWS31J// CP932//
module CP932// INTERNAL CP932 1
module INTERNAL CP932// CP932 1

SJIS-WIN や MS932 もあります
iconv コマンドには libiconv ではなくこっちが使われてるということで良さそうです

ちなみにこのファイルは Ubuntu の場合 「/usr/lib/x86_64-linux-gnu/gconv/gconv-modules」 で見れました