Есть ли какой-либо камень, который автоматически добавляет # encoding: UTF-8
к каждому файлу Ruby?
Или существует ли другой способ предотвратить ошибку invalid multibyte char (US-ASCII)
во всем проекте Ruby on Rails (а не только в одном классе)?
Есть ли какой-либо камень, который автоматически добавляет # encoding: UTF-8
к каждому файлу Ruby?
Или существует ли другой способ предотвратить ошибку invalid multibyte char (US-ASCII)
во всем проекте Ruby on Rails (а не только в одном классе)?
Попробуйте magic_encoding gem, он может вставить uft-8 магический комментарий ко всем рубиновым файлам в вашем приложении.
[EDIT] Перейдя на SublimeText, теперь я использую плагин auto-encoding-for-ruby.
Перейдите на Ruby 2.0, поскольку он кодирует по умолчанию кодировку UTF-8, устраняя необходимость в магических комментариях.
Vim:
:args **/*.ruby
:set hidden
:argdo norm! O# encoding: UTF-8
:wqa
Если вы используете Sublime Text 2, вы можете использовать плагин, который автоматически включает объявление кодировки при необходимости: https://github.com/elomarns/auto-encoding-for-ruby.
Как просто запустить script?
#!/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.
Добавление # encoding: UTF-8
в каждый файл Ruby автоматически делает смысл, когда ваши файлы действительно хранятся в UTF-8.
Если ваши файлы закодированы CP850 (по умолчанию AFAIK в Windows), и вы используете символы, отличные от ASCII, вы заменяете invalid multibyte char (US-ASCII)
на invalid multibyte char (UTF-8)
.
Я бы предпочел ручную модификацию и проверку каждого файла, если это действительно UTF-8.