[JRuby]Mój pierwszy skrypt i problem z kodowaniem xD

Na początku zaznaczam, że piszę przy użyciu NetBeans i w opcjach projektu mam ustawione kodowanie źródeł na UTF-8.
Mój pierwszy w życiu skrypt w Rubym, więc się nie śmiać, jeśli robię coś źle (co jest bardzo prawdopodobne):

[code]def basic_chars(string)
get_replacement = ->(char) do
case char
when ‘ą’ then ‘a’
when ‘ć’ then ‘c’
when ‘ę’ then ‘e’
when ‘ł’ then ‘l’
when ‘ń’ then ‘n’
when ‘ó’ then ‘o’
when ‘ż’ then ‘z’
when ‘ź’ then ‘z’
else char
end
end

new_string = ‘’
string.each_char do |char|
new_string << get_replacement.(char)
end

puts 'ENCODING: ', string.encoding
print 'BEFORE: ', string, "\nAFTER: ", new_string, “\n\n”

new_string
end

def print_filenames(path, separator_number = 0)
Dir.entries(path).delete_if { |filename| filename == ‘.’ || filename == ‘…’ } .each do |filename|
full_filename = “#{path}/#{filename}”
is_dir = File.directory?(full_filename)

puts "#{'  ' * separator_number}#{basic_chars(filename)}#{is_dir ? '/' : ''}"
print_filenames(full_filename, separator_number + 1) if is_dir

end
end

print "Path: "
path = STDIN.gets “\n”
path[-1] = ‘’
print “\n”

print_filenames(path)[/code]
Skrypt ma drukować nazwy plików i struktórę katalogów. Niestety nazwy plików, które zawierają polskie znaki drukowane są z krzakami, a przecież zamieniam polskie znaki
na odpowiedniki bez ogąków. Co robię źle?

Zainstaluj sobie jakąś przeglądarkę ze sprawdzaniem pisowni i spróbuj spojrzeć czasami na te czerwone podkreślenia :wink:

A co do problemu. Kodowanie źródeł, a kodowanie nazw plików to 2 różne sprawy. Nie używam windowsa, ale stawiam, że próbujesz czytać UTF-8, a nazwy plików są w windowsowym cp1250.

  1. Czy Twój terminal, na który idzie wyjście programu obsługuje poprawnie UTF-8? Spróbuj printnąć jakieś hardkodowane polskie ogonki i sprawdź czy będzie OK.
  2. Czy Twój system operacyjny zapisuje pliki w UTF-8?
  3. Czy Twoje ‘ę’ z kodu jest dokładnie tak samo zakodowanym ‘ę’ jak to z nazwy pliku?

U mnie (OS X) Twój program działa. Wypisuje z polskimi ogonkami poprawnie ale… nie zamienia ich na odpowiedniki bez ogonków!

Próbowałem gsubować ogonki na bezogonki - wyskoczył wyjątek:

in `gsub!': incompatible encoding regexp match (UTF-8 regexp with UTF8-MAC string) (Encoding::CompatibilityError)

Ciekawa sprawa. Wydaje mi się że wszystko robisz w porządku, i że to bardziej kwestia środowiska, które albo średnio obsługuje UTF-8, albo robi to po swojemu.