Решение исключительно для винды. Возможно, что где-либо еще оно не будет поддерживаться, поэтому можно включить его в сборку с пометкой об этом.
Короче, мы переводим строку в номера символов в таблице кодировки CP1251, если номер символа больше 128, то проверяем, содержится ли русская буква под его номером и заменяем ее на соответствующую букву в кодировке UTF8.
Пример кода:
str=File.expand_path(".")
ords=str.each_char.to_a
arr=[]
ords.each{ |item|
if item.ord<128
arr<<item
else
puts item.ord
case item.ord
when 196
arr<<["Д"]
end
end
}
arr.each{ |item|
puts item
}
Название папки символическое - Дебаггер.
Результат вывода:
- значит, что букву "Д" он уже точно перевел в нужную кодировку, ура!
Кстати, специально для аккуратности выполнения, немного модифицировал твой же код для скрипта в мейкере:
class SideScriptsLoader
class << self
def load(dir)
new(dir).load
end
def add_to_path(dir)
new(dir).add_to_path
end
end
def initialize(dir)
@dirname = File.expand_path dir, Dir.pwd
end
def load
if @dirname.ascii_only?
load_entries if Dir.exist? @dirname
else
puts 'error in load'
end
end
def add_to_path
if @dirname.ascii_only?
$LOAD_PATH << @dirname if Dir.exist? @dirname
else
puts 'error in add to path'
end
end
private
def load_entries
Dir.entries(@dirname).each do |entry|
require filname(entry) if entry =~ /\.rb\Z/
end
end
def filname(entry)
File.expand_path File.join(@dirname, entry), Dir.pwd
end
end
SideScriptsLoader.add_to_path 'lib' #добавляем lib папку в $LOAD_PATH
SideScriptsLoader.load 'lib' #загружаем все rb файлы из lib папки
Теперь он будет выдавать ошибку и не вылетать. Вылеты меня раздражали ^_^