【问题标题】:Call iconv from Ruby through system()通过 system() 从 Ruby 调用 iconv
【发布时间】:2010-04-30 08:16:45
【问题描述】:

iconv 工具有问题。我尝试以这种方式从 rake 文件中调用它:

Dir.glob("*.txt") do |file|
  system("iconv -f UTF-8 -t 'ASCII//TRANSLIT' #{ file } >> ascii_#{ file }")
end

但是一个文件被部分转换(部分转换的大小:10059092字节,转换前:10081854)。比较这两个文件证明并非所有内容都写入了 ASCII。当我从 shell 显式调用此命令时,它可以完美运行。其他较小的文件转换没有问题。 iconv 或 Ruby 的 system() 有什么限制吗?

【问题讨论】:

  • 如果您尝试从 irb 中对该特定文件进行系统调用会发生什么?

标签: ruby linux system iconv


【解决方案1】:

总是检查system的返回值以确定它是否成功是个好主意。

Dir.glob("*.txt") do |file|
  system("iconv -f UTF-8 -t 'ASCII//TRANSLIT' #{file} >> ascii_#{file}") or
    puts "iconv failed for file #{file}: #{$?}"
end

您也可以尝试使用 Iconv 标准库,从而摆脱系统调用:

require 'iconv'

source_file = 'utf8.txt'
target_file = 'ascii.txt'

File.open(target_file, 'w') do |file|
  File.open(source_file).each_line do |line|
    file.write Iconv.conv('ASCII//TRANSLIT', 'UTF-8', line)
  end
end

添加了适当的错误检查。

【讨论】:

  • Lars 我试过这个。 system("iconv ...") 为所有文件返回 true。
  • 您是否尝试过将 stderr 重定向到文件以查看 iconv 是否在那里输出任何内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多