Ruby: how to add “# encoding: UTF-8” automatically?

前端 未结 6 1021
时光说笑
时光说笑 2020-12-05 00:21

Is there any gem which adds # encoding: UTF-8 to each Ruby file automatically?

Or is there any other way to prevent from the invalid multibyte cha

相关标签:
6条回答
  • 2020-12-05 00:53

    Try magic_encoding gem, it can insert uft-8 magic comment to all ruby files in your app.

    [EDIT] Having switched to SublimeText now I use auto-encoding-for-ruby plugin.

    0 讨论(0)
  • 2020-12-05 00:56

    Adding a # encoding: UTF-8 to each Ruby file automatically makes only sense, when your files are really stored in UTF-8.

    If your files are encoded CP850 (AFAIK default in Windows) and you use Non-ASCII characters, you replace invalid multibyte char (US-ASCII) with invalid multibyte char (UTF-8).

    I would prefer a manual modification and check of each file, if it is really UTF-8.

    0 讨论(0)
  • 2020-12-05 00:59

    Upgrade to Ruby 2.0, as it makes UTF-8 the default encoding, removing the need for magic comments.

    0 讨论(0)
  • 2020-12-05 01:05

    Vim:

    :args **/*.ruby
    :set hidden
    :argdo norm! O# encoding: UTF-8
    :wqa
    
    0 讨论(0)
  • 2020-12-05 01:05

    If you're using Sublime Text 2, you can use a plugin that automatically includes encoding declaration when needed: https://github.com/elomarns/auto-encoding-for-ruby.

    0 讨论(0)
  • 2020-12-05 01:09

    How about just running a 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
    

    To make it automatic add this to your Rakefile.

    You could run file -bi #{path} and look for charset=utf-8 if you only want to update files that have utf-8 chars.

    0 讨论(0)
提交回复
热议问题