2011-01-26 12 views
29

¿Hay alguna gema que agregue # encoding: UTF-8 a cada archivo Ruby automáticamente?Ruby: cómo agregar "# codificación: UTF-8" automáticamente?

¿O hay alguna otra forma de evitar el error invalid multibyte char (US-ASCII) en todo el proyecto de Ruby on Rails (no en una sola clase solamente)?

+3

Esto no es lo que pediste, pero vale la pena que algunos editores de texto (por ejemplo, emacs) inserten automáticamente "#encoding: UTF-8" en la parte superior cuando guardas un archivo ruby ​​que contiene UTF-8. – sepp2k

Respuesta

23

Trate magic_encoding joya, se puede insertar UFT-8 comentario mágica para todos los archivos de rubí en su aplicación.

[EDITAR] Al haber cambiado a SublimeText ahora, uso el plugin auto-encoding-for-ruby.

+0

Esto puede funcionar, pero prefiero no agregar otra dependencia ... –

+0

tenga en cuenta que esto no será una dependencia, es una herramienta que edita todos los archivos por ti. puede desinstalar los términos posteriores si quiere –

+0

Esta es la versión de Atom para [auto-codificación-para-ruby] (https://atom.io/packages/auto-encoding-for-ruby) – Zakwan

6

Vim:

:args **/*.ruby 
:set hidden 
:argdo norm! O# encoding: UTF-8 
:wqa 
+1

¡Gracias! Gran sugerencia Para mí, vim colapsó (segfault) en el comando ': wqa' durante la escritura, dando como resultado algunos archivos escritos y un montón de .swp. Así que terminé usando ': wa', luego': q' que funcionó bien. Por supuesto, cambie '.ruby' a' .rb' si este último es su extensión ruby. –

+2

@William Denniss: Otro: 'argdo 0put = '# codificación: UTF-8'' – Benoit

2

¿Qué tal si solo ejecutamos un 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 

Para que sea automático, agréguenlo a su Rakefile.

Usted podría funcionar file -bi #{path} y buscar charset = UTF-8 si sólo desea actualizar los archivos que tienen UTF-8 caracteres.

0

Añadir un # encoding: UTF-8 a cada archivo Ruby automáticamente tiene sentido solo cuando sus archivos están realmente almacenados en UTF-8.

Si sus archivos están codificados CP850 (valor predeterminado de AFAIK en Windows) y utiliza caracteres no ASCII, reemplace invalid multibyte char (US-ASCII) con invalid multibyte char (UTF-8).

Preferiría una modificación manual y verificación de cada archivo, si es realmente UTF-8.

26

Actualice a Ruby 2.0, ya que hace que UTF-8 sea la codificación predeterminada, eliminando la necesidad de comentarios mágicos.

+1

No siempre es posible si tiene un código heredado. – Subimage

+0

@Subimage Creo que la mayoría del código heredado debería funcionar en las versiones más nuevas de ruby, la otra manera es más difícil. – Automatico

Cuestiones relacionadas