【问题标题】:Ruby: how to add "# encoding: UTF-8" automatically?Ruby:如何自动添加“# encoding: UTF-8”?
【发布时间】:2011-06-15 20:09:52
【问题描述】:

是否有任何 gem 可以自动将# encoding: UTF-8 添加到每个 Ruby 文件中?

或者有没有其他方法可以防止整个 Ruby on Rails 项目中出现invalid multibyte char (US-ASCII) 错误(不仅仅是在单个类中)?

【问题讨论】:

  • 这不是您要求的,但值得一些文本编辑器(例如 emacs)在您保存包含 UTF 的 ruby​​ 文件时自动在顶部插入“#encoding: UTF-8” -8.

标签: ruby encoding utf-8


【解决方案1】:

升级到Ruby 2.0,因为它使 UTF-8 成为默认编码,无需使用魔法 cmets。

【讨论】:

  • @Subimage 我相信大多数遗留代码应该可以在较新版本的 ruby​​ 中工作,其他方式更难。
【解决方案2】:

试试magic_encodinggem,它可以将uft-8魔术注释插入到你应用中的所有ruby文件中。

[编辑] 切换到 SublimeText 现在我使用 auto-encoding-for-ruby 插件。

【讨论】:

  • 请注意,这不是依赖项,它是一个为您编辑所有文件的工具。如果你愿意,你可以卸载后记
  • 这是auto-encoding-for-ruby的Atom版本
  • @Mirko 您是否获得了用于 Sublime Text 3 的 auto-encoding-for-ruby 插件?
  • @Mirko 嗯,我也在使用 ruby​​ 2.x,但由于某种原因在 irb 控制台中运行某些脚本时遇到问题。
【解决方案3】:

维姆:

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

【讨论】:

  • 谢谢!很好的建议。对我来说,vim 在写入过程中在:wqa 命令上崩溃(segfault),导致一些写入文件和一堆.swp。所以我最终使用:wa,然后使用:q,效果很好。当然,如果 .rb 是您的 ruby​​ 扩展,请将 .ruby 更改为 .rb
  • @William Denniss:另一个:argdo 0put ='#encoding: UTF-8'
【解决方案4】:

如果您使用的是 Sublime Text 2,则可以使用在需要时自动包含编码声明的插件:https://github.com/elomarns/auto-encoding-for-ruby

【讨论】:

    【解决方案5】:

    只运行一个脚本怎么样?

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

    如果您只想更新具有 utf-8 字符的文件,可以运行 file -bi #{path} 并查找 charset=utf-8

    【讨论】:

      【解决方案6】:

      仅当您的文件真正以 UTF-8 存储时,自动向每个 Ruby 文件添加 # encoding: UTF-8 才有意义。

      如果您的文件采用 CP850 编码(Windows 中的 AFAIK 默认设置)并且您使用非 ASCII 字符,请将 invalid multibyte char (US-ASCII) 替换为 invalid multibyte char (UTF-8)

      如果每个文件真的是 UTF-8,我更喜欢手动修改和检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 2014-06-12
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多