Ruby: как автоматически добавить "# encoding: UTF-8"? - PullRequest
30 голосов
/ 26 января 2011

Есть ли драгоценный камень, который автоматически добавляет # encoding: UTF-8 к каждому файлу Ruby?

Или есть какой-нибудь другой способ предотвратить ошибку invalid multibyte char (US-ASCII) во всем проекте Ruby on Rails (не только в одном классе)?

Ответы [ 6 ]

27 голосов
/ 01 мая 2013

Обновление до Ruby 2.0 , так как это делает кодировку UTF-8 по умолчанию, устраняя необходимость в волшебных комментариях.

24 голосов
/ 05 сентября 2011

Попробуйте magic_encoding gem, он может вставить магический комментарий uft-8 во все файлы ruby ​​в вашем приложении.

[EDIT] Теперь, переключившись на SublimeText, я использую auto-плагин encoding-for-ruby .

6 голосов
/ 26 января 2011

Vim:

:args **/*.ruby
:set hidden
:argdo norm! O# encoding: UTF-8
:wqa
2 голосов
/ 11 сентября 2012

Как насчет простого запуска скрипта?

#!/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.

Вы можете запустить file -bi #{path} и искать charset = utf-8 , если вы хотите обновить только файлы с символами utf-8.

2 голосов
/ 02 сентября 2012

Если вы используете Sublime Text 2, вы можете использовать плагин, который автоматически включает объявление кодировки при необходимости: https://github.com/elomarns/auto-encoding-for-ruby.

0 голосов
/ 12 сентября 2012

Добавление # encoding: UTF-8 к каждому файлу Ruby автоматически имеет смысл только тогда, когда ваши файлы действительно хранятся в UTF-8.

Если ваши файлы имеют кодировку CP850 (AFAIK по умолчанию в Windows) и вы используете символы не ASCII, вы заменяете invalid multibyte char (US-ASCII) на invalid multibyte char (UTF-8).

Я бы предпочел ручную модификацию и проверку каждого файла, если это действительно UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...