練習 3-3

文字列を置換する練習問題。

前回文字コードの変換が面倒だと書いた。

もうちょっとシンプルに変換

File#open で外部と内部の文字コードを指定。

読み込んだ文字列は内部コードに変換済み。

1行ずつ変換するよりも効率がよい (と信じてる*1 )

# -*- coding: utf-8; -*-
RUBY_VERSION        # => "1.9.2"

open('wagahaiwa_nekodearu.txt', 'r:cp932:utf-8') do |f|
  f.each_line do |buf|
    puts buf.gsub(//, 'にゃん。')
  end
end

変換いくない

そもそも入力した内容を変換するのがよくなくないか?

# -*- coding: utf-8; -*-
RUBY_VERSION        # => "1.9.2"

regex = /#{''.encode(Encoding::CP932)}/
dst = 'にゃん。'.encode(Encoding::CP932)

open('wagahaiwa_nekodearu.txt', 'r:cp932') do |f|
  f.each_line do |buf|
    puts buf.gsub(regex, dst)
  end
end

コード変換がループの外にあるから効率がよい (と信じてる*2 )

Regexp.new('。', Encoding::CP932) とか Regexp#encode(Encoding::CP932) とかできるといいのにね。

/regex/s とかしても文字列を CP932 に変換してくれない。
それ意味なくない?
元の文字コードも CP932 だったら、わざわざ s とか付けないでしょ。普通。

*1:実は一番遅かった。

*2:やはり一番速かった。