Ruby: comment ajouter" # encoding: UTF-8 " automatiquement?

Y a-t-il une gemme qui ajoute automatiquement # encoding: UTF-8 à chaque fichier Ruby?

Ou Existe-t-il un autre moyen d'empêcher l'erreur invalid multibyte char (US-ASCII) dans L'ensemble du projet Ruby on Rails (pas dans une seule classe seulement)?

30
demandé sur ДМИТРИЙ МАЛИКОВ 2011-01-26 15:48:26

6 réponses

Essayezmagic_encoding gem, il peut insérer un commentaire magique uft-8 à tous les fichiers ruby de votre application.

[modifier] Après être passé à SublimeText maintenant j'utiliseAuto-encoding-for-ruby plugin.

24
répondu Mirko 2013-02-28 23:30:24

Mise à niveau vers Ruby 2.0 , car il fait de L'UTF-8 l'encodage par défaut, supprimant le besoin de commentaires magiques.

26
répondu Paul McMahon 2013-05-01 07:32:17

Vim:

:args **/*.ruby
:set hidden
:argdo norm! O# encoding: UTF-8
:wqa
6
répondu Benoit 2013-04-29 10:10:46

Si vous utilisez Sublime Text 2, Vous pouvez utiliser un plugin qui inclut automatiquement la déclaration d'encodage si nécessaire: https://github.com/elomarns/auto-encoding-for-ruby .

2
répondu Elomar Nascimento dos Santos 2012-09-01 22:25:48

Que diriez-vous simplement d'exécuter 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

Pour le rendre automatique, ajoutez ceci à votre fichier Rakefile.

Vous pouvez exécuter file -bi #{path} et regarder pour charset=utf-8 si vous souhaitez uniquement mettre à jour les fichiers qui ont utf-8 caractères.

2
répondu G. Allen Morris III 2012-09-12 22:52:14

Ajouter un # encoding: UTF-8 à chaque fichier Ruby n'a automatiquement de sens que lorsque vos fichiers sont réellement stockés en UTF-8.

Si vos fichiers sont codés CP850 (AFAIK par défaut dans Windows) et que vous utilisez des caractères non-ASCII, vous remplacez invalid multibyte char (US-ASCII) par invalid multibyte char (UTF-8).

Je préférerais une modification manuelle et une vérification de chaque fichier, si c'est vraiment UTF-8.

0
répondu knut 2012-09-11 21:13:49