Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 文件名中的希腊字母_Ruby_Encoding - Fatal编程技术网

Ruby 文件名中的希腊字母

Ruby 文件名中的希腊字母,ruby,encoding,Ruby,Encoding,我的目标是将所有希腊命名文件重命名为英语文件(只需将希腊字符更改为各自的英语字符)。这是我的代码: 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 在放置字母map[“α”]

我的目标是将所有希腊命名文件重命名为英语文件(只需将希腊字符更改为各自的英语字符)。这是我的代码:

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

放置字母map[“α”]
时,它打印
a
。如果我有一个名为
α.txt
的文件,它就没有了。我尝试了
letter.encoding(encoding::UTF_8)
letter.force_编码(encoding::UTF_8)
;两者都不起作用。如何使用希腊文字母为
字母map
编制索引?

文件系统编码(
encoding.find('filesystem')
)的
Dir
方法默认为文件系统编码。在Windows上是ANSI或OEM字符集(),但仍然不是UTF-8或UTF-16LE(现代Windows版本使用)。问题是您的文件系统编码不能表示
α
字符。Ruby然后用
悄悄地替换这些字符。尝试打印
文件名

解决方案是通过
encoding
关键字参数显式指定能够表示此字符的编码

例如:

Dir.foreach('.', encoding: Encoding::UTF_8) do |file_name|
  # ...
end

你确定文件名是
“α”.txt
(或
“\”α\“.txt”
)而不是
α.txt
“α.txt”
)?@sawa很抱歉,你是对的,文件名是“α.txt”(没有引号),修复了为什么不使用
文件名的问题。每个字符都
,并避免
分割
部分?无论如何,您可能只想使用在一次拍摄中重新映射所有字母。这样做很好:
“αβ123.txt”.tr(“αβ”,“ab”)#=>“ab123.txt”
。哦,我看到@tadman提到了这一点。我将为示例留下注释。我正在打印文件名,顺便说一句,它确实在终端中打印
。如果我将输出发送到.txt,它实际上是在打印
α
。我想这是因为我的编辑器使用的编码(升华文本)