From: take_tk Date: 2008-08-06T11:25:29+09:00 Subject: [ruby-dev:35774] Re: 文字コードがシンボルでないのは何故? たけ(tk)です [ruby-dev:35773] Re: 文字コードがシンボルでないのは何故? にて Nobuyoshi Nakada さん曰く: > シンボルリテラルには(クォートしない限り)使えない文字が、エンコー > ディング名にはしばしば使われているからです。 > > > :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)=熊谷秀武