diary of a madman RSSフィード

2008-01-02 Wed

[] Ruby 1.9 m17n リファレンス (不完全版)  Ruby 1.9 m17n リファレンス (不完全版)を含むブックマーク

以前書いた記事(Ruby 1.9 の新機能を調べてみた)の m17n がらみの箇所についてコメントやらトラックバックやらをいただいたので、もう少し調べてまとめてみた。

なお、1.9.0 リリース版ではなく、開発版(trunk r14835)で動作を確認している。

コマンドラインオプション

マジックコメント

Encoding クラス

p Encoding.list #=> [#<Encoding:ASCII-8BIT>, #<Encoding:EUC-JP>, #<Encoding:Shift_JIS>, #<Encoding:UTF-8>, #<Encoding:ISO-2022-JP (dummy)>, #<Encoding:Windows-31J>]
p Encoding.find('Windows-31J')                #=> #<Encoding:Windows-31J>
p Encoding.find('Windows-31J').base_encoding  #=> #<Encoding:Shift_JIS>

String クラス

ascii = 'a'.force_encoding('ASCII')
utf8  = ''.force_encoding('UTF-8')
p (ascii + utf8).encoding  #=> #<Encoding:UTF-8>

Regexp クラス

p /あ/u.encoding #=> #<Encoding:UTF-8>
    • 互換性の無いエンコーディングを持った文字列とマッチングを行なった場合は ArgumentError が発生。
//u.match("\xa4\xa2".force_encoding('EUC-JP')) #=> ArgumentError: incompatible encoding regexp match (UTF-8 regexp with EUC-JP string)
p /a/n.fixed_encoding?  #=> false
p /あ/u.fixed_encoding? #=> true

IO クラス

$stdin.set_encoding('UTF-8:Shift_JIS')  #=> #<IO:<STDIN>>
p $stdin.internal_encoding     #=> #<Encoding:Shift_JIS>
p $stdin.external_encoding     #=> #<Encoding:UTF-8>
p Encoding.default_external  #=> #<Encoding:UTF-8>
open('filename', 'r') do |f|
  p f.internal_encoding      #=> nil
  p f.external_encoding      #=> #<Encoding:UTF-8>
  p f.read.encoding          #=> #<Encoding:UTF-8>
end
open('filename', 'r:EUC-JP') do |f|
  p f.internal_encoding      #=> nil
  p f.external_encoding      #=> #<Encoding:EUC-JP>
  p f.read.encoding          #=> #<Encoding:EUC-JP>
end
      • IO#internal_encodingnil 以外の場合、読み出した文字列を external_encoding から internal_encoding に変換した結果が返る。
p Encoding.default_external  #=> #<Encoding:UTF-8>
open('filename', 'r:EUC-JP:UTF-8') do |f|
  p f.internal_encoding      #=> #<Encoding:UTF-8>
  p f.external_encoding      #=> #<Encoding:EUC-JP>
  p f.read.encoding          #=> #<Encoding:UTF-8>
  # ↑ここで EUC-JP から UTF-8 へ変換
end
    • 書き込み時
      • IO#internal_encodingIO#external_encoding がともに nil の場合、エンコーディングの変換(transcode)は行なわれずにそのまま出力される。(デフォルト動作)
      • IO#internal_encodingnilIO#external_encoding が設定されている場合、文字列のエンコーディングexternal_encoding に変換した結果を出力する。(内部では String#encode が呼ばれる)
str = "\xa4\xa2".force_encoding('EUC-JP')  # EUC-JP で 'あ'
p $stdout.internal_encoding        #=> nil
p $stdout.external_encoding        #=> nil
$stdout.set_encoding('UTF-8')
p $stdout.internal_encoding        #=> nil
p $stdout.external_encoding        #=> #<Encoding:UTF-8>
puts str   #=> あ
# ↑ここで EUC-JP から UTF-8 へ変換
      • IO#internal_encodingIO#external_encoding がともに設定されている場合、文字列が持っているエンコーディング情報に関わらず、エンコーディングinternal_encoding から external_encoding へ変換した結果を出力する。(内部では String#encode が呼ばれる)
str = "\xa4\xa2".force_encoding('ASCII')  # EUC-JP で 'あ'
$stdout.set_encoding('UTF-8', 'EUC-JP')
p $stdout.internal_encoding       #=> #<Encoding:EUC-JP>
p $stdout.external_encoding       #=> #<Encoding:UTF-8>
p str.encoding                    #=> #<Encoding:ASCII-8BIT>
puts str   #=> あ
# ↑ここで EUC-JP から UTF-8 へ変換

まだ理解してない部分、抜けてる部分、挙動が確定してなさそうな部分(バイナリモードの IOエンコーディング指定するとどうなるの? とか)があるので、気づいたら徐々に穴埋めするかも。

  • 2008/01/04 説明文を修正。

*1:余談。今のところ、マジックコメントで指定可能なのは "encoding" と "coding" の 2 つだけ(parser.y の magic_comments)。将来的には何か増えるのかも?

tootoo 2008/01/07 04:13 String#size、String#length、String#bytesize
の項目が</CODE>で閉じるところが<CODE>になってます
Operaだとリストの項目をまたいで<CODE>が影響してしまうようで
ここ以降がものすごく小さいフォントで表示されてしまい読みにくいです
Firefoxだとリストの項目ごとにリセットされて影響無いようですね

1.9.0の変更点がよくわからなかったので、とても助かりました

macksmacks 2008/01/07 04:39 指摘ありがとうございます。修正しました。

泰原泰原 2009/03/19 13:16 良いPOSTありがとうございます。
助かりました。

oni2menoni2men 2011/10/02 20:11 有効なエンコーディング名が記載されているものが見つからなかったので、助かりました!ありがとうございます。