我的目标是将所有希腊语命名的文件重命名为英语文件(只需将希腊字符更改为各自的英文字符)。这是我的代码:
lettersmap = {"α"=>"a"}
puts lettersmap["α"]
Dir.foreach('.') do |file_name|
file_name = file_name.split('')
file_name.each do |letter|
puts lettersmap[letter]
end
end
end
在puts lettersmap["α"]
,它会打印a
。如果我有一个名为α.txt
的文件,那么它就没有了。我试过letter.encoding(Encoding::UTF_8)
和letter.force_encoding(Encoding::UTF_8)
;既没有奏效。如何使用希腊字母索引lettersmap
?
答案 0 :(得分:2)
Dir
方法默认为文件系统编码(Encoding.find('filesystem')
)。在Windows上,它是ANSI或OEM字符集(an explanation from Microsoft),但仍然既不是UTF-8也不是UTF-16LE(现代Windows版本使用)。问题是在您的情况下文件系统编码不能代表α
字符。 Ruby然后默默地用?
替换这些字符。尝试打印file_name
!
该解决方案明确指定了一种能够通过encoding
关键字参数表示此字符的编码。 UTF-8 is usually a good choice
示例:
Dir.foreach('.', encoding: Encoding::UTF_8) do |file_name|
# ...
end