From: "NARUSE, Yui" Date: 2008-08-06T12:46:44+09:00 Subject: [ruby-dev:35775] Re: 文字コードがシンボルでないのは何故? すでにRuby内での正規名としてIANA名を用いる仕組みがあるので、 わざわざ俗称を推奨するようなことをする必然性が シンボルであるということには無いように感じます。 08/08/06 に take_tk さんは書きました: > たけ(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)=熊谷秀武 > > > -- -- 成瀬ゆい naruse@airemix.jp