2015-10-01 175 views
1

我的目標是將所有希臘文文件重命名爲英文文件(只需將希臘字符更改爲各自的英文文件)。這是我的代碼:文件名中的希臘字母

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

確定文件名是' 「α」 .txt'(或' 「\」 α\」。TXT 「'),而不是'α.txt'('」 α.txt「')? – sawa

+0

@sawa對不起,你的文件被命名爲「α.txt」(沒有引號),修復了這個問題 – Crone

+3

爲什麼不使用'file_name.each_char'並避免'split'部分?您可能只想使用['tr'](http://ruby-doc.org/core-2.2.3/String.html#method-i-tr)重新映射一個鏡頭中的所有字母。 – tadman

回答

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 
+0

我正在打印file_name順便說一句,它確實在終端打印'?'。如果我將輸出發送到.txt文件,它實際上是在打印「α」。我想這是因爲我的編輯器使用的編碼(崇高文本) – Crone