web-dev-qa-db-ja.com

Ruby:「#encoding:UTF-8」を自動的に追加する方法

# encoding: UTF-8を各Rubyファイルに自動的に追加するgemはありますか?

または、Ruby on Railsプロジェクト(単一クラスのみではない))全体でinvalid multibyte char (US-ASCII)エラーを防ぐ他の方法はありますか?

30
krn

magic_encoding gemを試してください。アプリ内のすべてのRubyファイルにuft-8マジックコメントを挿入できます。

[編集] SublimeTextに切り替えたので、 auto-encoding-for-Ruby プラグインを使用します。

24
Mirko

Ruby 2. にアップグレードすると、UTF-8がデフォルトのエンコードになり、マジックコメントが不要になります。

28
Paul McMahon

Vim:

:args **/*.Ruby
:set hidden
:argdo norm! O# encoding: UTF-8
:wqa
6
Benoit

スクリプトを実行するだけではどうですか?

#!/usr/bin/env Ruby1.9.1
require 'find'

fixfile = []

Find.find('.') do |path|
  next unless /\.rb$/.match(path);
  File.open(path) do |file|
    count = 0;
    type = :lib
    file.each do |line|
      if count == 0 and /#!/.match(line)
        type = :script
      end
      if  /utf/.match(line)
        break
      end
      if (count += 1) > 10 then
        fixfile.Push path:path, type:type
        break
      end
    end
    if file.eof?
        fixfile.Push path:path, type:type
    end
  end
end

fixfile.each do |info|
  path = info[:path]
  backuppath = path + '~'
  type = info[:type]
  begin
     File.delete(backuppath) if File.exist?(backuppath)
     File.link(path, backuppath)
  rescue Errno::ENOENT => x
     puts "could not make backup file '#{backuppath}' for '#{ path }': #{$!}"
     raise
  end
  begin
    inputfile = File.open(backuppath, 'r')
    File.unlink(path)
    File.open(path, 'w') do |outputfile|
      if type == :script
        line = inputfile.readline
        outputfile.write line
      end
      outputfile.write "# encoding: utf-8\n"
      inputfile.each do |line|
        outputfile.write line
      end
      inputfile.close
      outputfile.close
    end
  rescue => x
    puts "error: #{x} #{$!}"
    exit
  end

これを自動化するには、これをRakefileに追加します。

Utf-8文字を含むファイルのみを更新する場合は、file -bi #{path}を実行してcharset = utf-8を探すことができます。

2

Sublime Text 2を使用している場合は、必要に応じてエンコード宣言を自動的にインクルードするプラグインを使用できます: https://github.com/elomarns/auto-encoding-for-Ruby