From: Yukihiro Matsumoto Date: 2008-01-05T12:17:56+09:00 Subject: [ruby-list:44438] Re: Text Encoding in Ruby 1.9.0 まつもと ゆきひろです In message "Re: [ruby-list:44436] Text Encoding in Ruby 1.9.0" on Sat, 5 Jan 2008 11:33:04 +0900, "Hideo Konami" writes: |1. ruby のオプションの -Ku があるかないかで,ソースの中の | 文字列リテラルのエンコーディングが UTF-8 になるか | ASCII-8BIT になるのかが決定されるという理解で正しいの | でしょうか。 -Kは1.8互換のオプションで推奨されません。-Kuを指定すると、 * スクリプトのデフォルトのエンコーディング * 入力のデフォルトのエンコーディング がUTF-8になります。また-Kや-Eなどエンコーディングを指定するオ プションがまったく指定されないと、スクリプトのエンコーディン グのデフォルトは「ASCII-8BIT」になります。また、入力のデフォ ルトのエンコーディングはlocaleから決定されます。小波先生の場 合には「UTF-8」のようですね。 |2. force_encoding は破壊的にエンコーディングを変更する仕様 | になっているようですが,それはむしろ force_encoding! の | ほうがよかったのはないでしょうか。 "force" に "!" がすで | に入っている?非破壊的なメソッドもあるべきだと思うのです | が。 force_encodingは文字列の内容とは無関係にエンコーディング情報 を書き換える(内容の変換などは一切しない)という意味で「普通の 人」が使うメソッドではないと考えています。ので、使いやすさな どを考慮して2バージョンを用意するなどの配慮は行っていません。 |3. EUC-JP のテキストを読み込んだはずなのに,そのテキストが |  encoding が UTF-8 を返すのはへんだと思うのですが,どうい | う考えでそうなるのでしょうか。SJIS, JIS のテキストでもやは | り同様の動作になっています。 先生のプログラムでは読み込むファイルのエンコーディングが 「EUC-JP」であるとはどこにも指定していませんから、Rubyにはそ れが「EUC-JP」であると知る手段がありません。ですから、locale にしたがい、入力データは基本的に「UTF-8」なのだと信じるしかな いわけです(間違いの可能性が否定できず、間違えると悲惨なことに なる自動判別は組み込みではサポートしていません)。 明示的に指定する場合には、openの部分を open("text_euc.txt") から # 「EUC-JP」エンコーディングを付与する場合 open("text_euc.txt", "r:euc-jp") または # 「EUC-JP」ファイルを「UTF-8」に変換して読み込む場合 open("text_euc.txt", "r:euc-jp:utf-8") としてください。 |4. transcode.c には str.encode(encoding), str.encode!(encoding) | というのがあり,これらは force_encoding(encoding) とだいたい同義 | だと思ったのですが,違うようです。もう少し調べてみようとは思い | ますが,どう使うべきものか教えていただけると幸いです。 encodeメソッドは文字列の内容を変換します。内容に関らず単にエ ンコーディングの情報を書き換えるforce_encodingとは目的からし て違います。 まつもと ゆきひろ /:|)