我对编程完全陌生,并且在过去几周学习了一些 ruby 教程。我需要一个程序来替换大约 600 个文件中的几个单词。目前我被困在使用 sub 和 gsub 来更改我从特定文件中读取的变量中的单词。
My code looks like this:
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
puts
text_full = File.read(item_dat_file)
puts text_full
text_full.sub!('[UNIT]', "TESTIT")
puts text_full
不幸的是,变量 text_full 的两个输出都是相同的,没有任何东西被替换。
[ U N I T] #=> should be changed
...
[ / U N I T ]
我正在从 utf-16 Little Endian 编码读取文件(这是文件所属的游戏给我的)。这可能是问题吗?因为在将其读入 ruby 变量后,所有字符之间都会添加空格。Ruby 告诉我 item_dat_file.encoding,该文件是 UTF-8。
非常感谢。
编辑:
我发现了一个关于用 ruby 打开 UTF-16 文件的提示。我更改了代码:
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
text_full = File.open(item_dat_file, "rb:UTF-16LE:UTF-8").read
puts text_full.sub("UNIT", "TESTIT")
puts text_full
end
现在打印的文本很好,没有更多的空格字符。但是,当写回文件时,我该如何扭转呢?最后它应该再次具有 UTF-16。
编辑2:
这是我最初的问题的解决方案。
Dir.glob("items/**/*.dat") do |item_dat_file|
puts "working on: " + item_dat_file + " ... "
text_full = File.open(item_dat_file, "r:UTF-16LE:UTF-8").read
text_full.sub!("UNIT", "TESTIT")
puts text_full
File.open(item_dat_file, "w:UTF-16LE").write text_full
end
按预期工作。非常感谢您的帮助。