たけ(tk)です

[ruby-dev:35773] Re: 文字コードがシンボルでないのは何故? にて
Nobuyoshi Nakada <nobu / ruby-lang.org> さん曰く:

> シンボルリテラルには(クォートしない限り)使えない文字が、エンコー
> ディング名にはしばしば使われているからです。
> 
> > :euc_jp とか :utf_8 とか :shift_jis などのような、小文字+アンダースコア
> > 型のシンボルのほうがIDらしくて良いような気がするのですが・・。
> 
> その例でいうと、:shift_jis以外は有効なエンコーディング名ではあり
> ません。

(a)《世に通用している様々なエンコーディング名》、と
(b)《Rubyにおけるエンコーディングの識別名》(Encodingクラスの識別名)

とを分離する、という提案でもあります。

(a)《世に通用している様々なエンコーディング名》は文字列にして
(b)《Rubyにおけるエンコーディングの識別名》はシンボルにすべし

《Rubyにおけるエンコーディングの識別名》というのは、Encodingクラスのサブ
クラスまたはその複製(replicate)の識別名であり、サブクラスまたはその複
製と1対1で対応するもの。

《Rubyにおけるエンコーディングの識別名》は《正式なエンコーディング名》で
ある必要はない。Encodingクラスのサブクラスの名前の小文字化という機械的な
命名でもよい。

《Rubyにおけるエンコーディングの識別名》は識別名なのでシンボルであるのが
望ましく、また《世に通用している様々なエンコーディング名》とは概念的に区
別する意味でも文字列でないほうが望ましい。

それに対して、

《世に通用している様々なエンコーディング名》においては、シンボルリテラル
には(クォートしない限り)使えない文字が使われているので文字列で記述するの
が妥当。

《世に通用している様々なエンコーディング名》においては、同一のエンコーディ
ングに複数の名前が使われているのでハッシュテーブルを用意しておく必要があ
る。

> >  *   Encoding.aliases
> >  *   => {"BINARY"=>:ascii_8bit, "ASCII"=>:us_ascii, "ANSI_X3.4-1986"=>us_ascii,
> >  *       "SJIS"=>:shift_jis, "eucJP"=>:euc_jp, "CP932"=>:windows_31j}
> 
> 意図がよくわかりませんが、なぜ片方だけ文字列のままなんでしょうか。

aliases を持ち出したのは、《世に通用している様々なエンコーディング名》か
ら《Rubyにおけるエンコーディングの識別名》への変換を考えていたからです。

なので、{《正式名》の文字列 => 《Rubyにおけるエンコーディングの識別名》
のシンボル}というデータも必要になります。

*   Encoding.aliases
*   => {"ASCII-8BIT"    => :ascii_8bit,   # 正式名=>識別名
        "BINARY"        => :ascii_8bit, 
        "US-ASCII"      => :us_ascii,     # 正式名=>識別名
        "ASCII"         => :us_ascii, 
        "ANSI_X3.4-1986"=> :us_ascii,
        "Shift-JIS"     => :shift_jis,    # 正式名=>識別名
        "SJIS"          => :shift_jis, 
        "EUC-JP"        => :euc_jp,       # 正式名=>識別名
        "eucJP"         => :euc_jp, 
        "Windows-31J"   => :windows_31j,  # 正式名=>識別名
        "CP932"         => :windows_31j }
《世に通用している様々なエンコーディング名》
                        => 《Rubyにおけるエンコーディングの識別名》

http://svn.ruby-lang.org/repos/ruby/trunk/enc/shift_jis.c

ENC_ALIAS("Shift_JIS",    "shift_jis") /* 正式名 => 識別名 */
ENC_ALIAS("SJIS",         "shift_jis")

ENC_ALIAS("Windows-31J",  "windows_31j")  /* 正式名 => 識別名 */
ENC_ALIAS("CP932",        "windows_31j")
ENC_ALIAS("csWindows31J", "windows_31j")

ENC_ALIAS("MacJapanese", "mac_japanese")   /* 正式名 => 識別名 */
ENC_ALIAS("MacJapan",    "mac_japanese")

* ENC_ALIASの第二引数はシンボル《Rubyにおけるエンコーディングの識別名》
* 第一引数は《世に通用している様々なエンコーディング名》の文字列

ENC_REPLICATE("windows_31j",  "shift_jis") /* 識別名シンボルで複製 */

ENC_REPLICATE("mac_japanese", "shift_jis") /* 識別名シンボルで複製 */

* ENC_REPLICATEは、両方ともシンボル《Rubyにおけるエンコーディングの識別名》

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武