Ruby:如何自动添加“# encoding: UTF-8”?

Posted

技术标签:

【中文标题】Ruby:如何自动添加“# encoding: UTF-8”?【英文标题】:Ruby: how to add "# encoding: UTF-8" automatically? 【发布时间】: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. 【参考方案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,我更喜欢手动修改和检查。

【讨论】:

以上是关于Ruby:如何自动添加“# encoding: UTF-8”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 selenium webdriver 中自动化桌面通知 - ruby

如何使用 ruby​​ api 创建一个 bigquery 表并从云存储导入

如何使用 ruby​​gem 'rodf' 添加电子表格列?

如何在 Ruby 中向异常消息中添加信息?

如何在数组 ruby​​ 中添加元素?

如何在 Ruby 中向 RDoc 添加现有注释? [关闭]