LINUX.ORG.RU

Русская кодировка в путях

 , ,


0

1

Сегодня тестировал свою программу под оффтопиком.
Выяснилась паршивая вещь, а именно: кириллица в путях не поддерживается (версия ruby 1.8.x). Пришлось писать конвертор кодировки. После чего файлы из подкаталогов типа File.join(root_dir, 'base', 'clients.sqlite') стали нормально открываться, но перестали корректно работать штатные функции типа «File.exists?(path)» и «File.directory?(path)»

В итоге прихожу к выводу, что под мастдаем придется корневой путь задавать в виде точки (".") и следить чтобы текущий каталог не «уходил» во время обращения к подкаталогам внутри программы.

Понимаю что проблема немного офтопная, но все же приходится заботиться обо всех хомячках, а не только о линуксоидах, так пытаюсь написать действительно кроссплатформенное решение.

Вопросы такие:
1) как «бороться» с русской кодировкой в мастдае?
2) эта проблема только в winxp, или в win7 тоже не UTF-8?
3) эта проблема только ruby 1.8.x, или в 1.9.x тоже?

Ниже вариант обсуждаемого кода:

  def os_family
    case 
      when /ix/i, /ux/i, /gnu/i, /sysv/i, /solaris/i, /sunos/i, /bsd/i
        "unix"
      when /win/i, /ming/i
        "windows"
      else
        "other"
    end
  end

  root_dir = Dir.pwd
  if os_family == 'windows'
    begin
      require 'iconv'
      converter = Iconv.new('UTF-8', 'WINDOWS-1251')
      root_dir = converter.iconv(root_dir)
    rescue Exception
      root_dir = '.'
    end
  end

★★★★

слышал, что в 2.0 должно работать.

kelyar ★★★★★ ()

подними виртуалку с виндой, установи 1.9 и затесть. дело не шибко долгое/умное

ZuBB ★★★★★ ()

>как «бороться» с русской кодировкой в мастдае?

Задать кодировку для ФС или что-то такое. Лучше всё же просто не пользоваться оффтопом совсем.

anonymous ()

еще у себя пришлось заюзать такую фигню

Encoding.default_external = 'UTF-8'
Encoding.default_internal = 'UTF-8'

но не уверен распостраняется ли оно на пути

ZuBB ★★★★★ ()
Ответ на: комментарий от ZuBB

Этого свойства у класса Object в версии 1.8 нет...

Короче, весь тред сводится к переходу на более новые версии руби.
Буду думать, спасибо отписавшимся!

p.s. А оффтопик я уже более 4х лет принципиально не юзаю.

Novator ★★★★ ()

Боюсь, вам придётся всё-таки экспериментально выяснить, как именно работает под нужной версией венды и заточить под неё. Потому что мой скромный опыт выяснения где в венде какая кодировка окончился ничем. В одной венде в разных местах / библиотеках находился и CP1251 и Unicode и вообще чёртшто. А её локализации вообще могут свести это к другим кодировкам.

Alve ★★★★★ ()
Ответ на: комментарий от Alve

В том и прикол, я всячески извращался перекодируя между CP866, CP1251 и UTF-8. В свою убогую консольку она выводит в CP866, выдает в путях CP1251, а внутри ruby конкатенация работает в UTF-8.

А еще прикол: после преобразования путей в UTF-8, файлы начинают открываться, но штатные фунции exists? и directory? перестают работать! ))
Я долго не мог понять почему в консоль каку выводила, пока не допер в кодировку CP866 перед выводом в консоль кодировать )

Короче, обычный мастдайный зоопарк!
Костыль на костыле и костылем погоняет...

Novator ★★★★ ()

Ааа!! Никто не сказал, что у меня код побитый. Исправляюсь:

  # Platform detection
  # RU: Определение платформы
  def os_family
    case RUBY_PLATFORM
      when /ix/i, /ux/i, /gnu/i, /sysv/i, /solaris/i, /sunos/i, /bsd/i
        "unix"
      when /win/i, /ming/i
        "windows"
      else
        "other"
    end
  end

Novator ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.