Проблема с кириллицей в консоли - PullRequest
4 голосов
/ 28 декабря 2010

извините за плохой английский.Это код Ruby.

s = "мистика"

`touch #{s}`
`cat #{s}`
`cat < #{s}`

Кто-нибудь может сказать, почему код не работает?С

sh: невозможно открыть ми�тика: Нет такого файла

Но этот код работает нормально

s = "работает" 
`touch #{s}` 
`cat #{s}` 
`cat < #{s}` 

Проблема только в том случае, если русский символ'с' в слове и с символом '<' </p>

woto@woto-work:/tmp$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

woto@woto-work:/tmp$ ruby -v 
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] 

woto@woto-work:/tmp$ uname -a 
Linux woto-work 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 10:14:11 
UTC 2010 x86_64 GNU/Linux 

woto@woto-work:/tmp$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description:    Ubuntu 10.04.1 LTS 
Release:        10.04 
Codename:       lucid 

Другой пример

возможно, это также будет полезно для понимания моей проблемы

woto@woto-work:~/rails/avtorif$ touch мистика
woto@woto-work:~/rails/avtorif$ ruby -e "`cat < мистика`"
woto@woto-work:~/rails/avtorif$ ruby -e '`cat < мистика`'
sh: cannot open ми�тика: No such file

Ответы [ 4 ]

1 голос
/ 15 января 2011

Это ошибка в dash, оболочке, которую Debian использует по умолчанию (символическая ссылка /bin/sh приводит к /bin/dash; а для Python os.system используется sh. Ruby, вероятно, также использует sh).dash не может правильно анализировать 8-битный текст, включая UTF-8.Чтобы обойти вашу проблему, замените ее на bash:

sudo dpkg-reconfigure dash

и выберите «Нет».Таким образом, система будет использовать bash в качестве оболочки /bin/sh, которая может обрабатывать UTF-8.

0 голосов
/ 28 декабря 2010

используйте ruby ​​1.9, он имеет методы force_encoding в объекте String

0 голосов
/ 28 декабря 2010

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

touch мистика
cat мистика
cat < мистика

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

Ruby 1.9 понимает кодировки набора символов, чего не понимал Ruby 1.8.Вам нужно будет провести небольшое исследование, чтобы определить, какую кодировку символов использует ваша оболочка.После этого вы создадите команды в виде обычных строк:

touch = "touch #{s}".force_encoding("UTF-8") ## or whatever encoding you need

, а затем выполните команду:

`#{touch}`

Я считаю, что кодировка Ruby 1.9 по умолчанию - UTF-8,Ruby 1.8 не имеет понятия кодирования, а строка представляет собой просто массив байтов.К сожалению, не каждая часть программного обеспечения понимает Unicode или концепции кодирования символов (так же, как Ruby 1.8).В этих случаях система будет использовать любую кодировку по умолчанию.Я подозреваю, что ваша оболочка может быть одной из таких программ.

0 голосов
/ 28 декабря 2010

Следующее работает для меня, вы пробовали это так?

s="мистика"
touch $s

В bash вы ссылаетесь на переменную перед знаком доллара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...