2010-12-28 10 views
3

悪い英語をお待ち申し上げます。それはRubyのコードです。コンソールのキリル記号の問題

なぜコードが失敗するのか誰にも分かりますか?

SHで:そのようなファイル

をしかしTHICのコードでは、細かい

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

問題は言葉でととする場合にのみ、ロシアのシンボル 'с' のある作品:митика開くことはできませんsymobol '<'

[email protected]:/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= 

[email protected]:/tmp$ ruby -v 
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] 

[email protected]:/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 

[email protected]:/tmp$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 10.04.1 LTS 
Release:  10.04 
Codename:  lucid 

別の例

多分これはまた

[email protected]:~/rails/avtorif$ touch мистика 
[email protected]:~/rails/avtorif$ ruby -e "`cat < мистика`" 
[email protected]:~/rails/avtorif$ ruby -e '`cat < мистика`' 
sh: cannot open ми�тика: No such file 
+1

Ruby 1.9.1を使用している 'en_US.UTF-8'環境で、ファイル名で同じ動作をします。 '\' echo "hello">#{s} \ 'を実行すると、"ми\321тика "(' ls -b')という名前のファイルが作成されます。 –

+0

Rubyの問題ではなく、Ubuntuの問題だと思われます。 Pythonの上でこのコードも 正しい>>>インポートOS >>> os.system( '猫мистика') >>> os.system( '猫<мистика') SHに動作していないため、 :できませんмитика:そのようなファイルはありません 私はこの質問をRoRについてのロシアのメーリングリストの別のスレッドで尋ねましたが、一部の人々はこのバグを確認しています。 – woto

答えて

1

これはdashのバグ、Debianはデフォルトで使用するシェル(。;およびPythonのos.systemshを使用するRubyは、おそらくあまりにもshを使用してシンボリックリンク/bin/sh/bin/dashにつながる)です。 dashは、UTF-8を含む8ビットのテキストを正しく解析できません。

sudo dpkg-reconfigure dash 

をし、「いいえ」を選択します。あなたの問題を回避するには、bashによってそれを置き換えます。この方法では、システムはbash/bin/shシェルとして使用します。これはUTF-8を処理できます。

+0

多くのありがとう、それは本当です。 – woto

0

私のために、次の作品を自分の問題を理解するために有用である、あなたはそれをこのようにしようとしているのだろうか?

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

bashでは、ドル記号の前に変数があります。

+0

あなたの答えは適用されません。 –

+0

@Dennis Williamson:それはなぜですか?あなたは詳しく説明できますか? –

+0

答えはBashです。質問はRubyに関するものです(Rubyに表示されているコードは[bash]とタグ付けされていますが)。また、問題のエラーは、リダイレクトを含む行によって生成されます。他の行は正常に動作します。 '#{}'は式の値を代入します。 –

-2

使用ルビー1.9それはあなたがシェルコマンドを実行している、あなたの例のそれぞれではStringオブジェクトに

+0

OPの例でそれをどのように活用していますか? –

0

をする方法をforce_encodingました。最初のステップとして、私はあなたが直接に入力するときにそれを期待するとして、あなたのシェルコマンドを実行していることを確認します:

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

あなたはシェルでエラーが発生している場合、それは二つの可能性のいずれかです。シェルコマンドが文字エンコーディングを理解していないか、ファイル名が適切に区別されるように引用符が必要です。

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とよく似ています)。そのような場合、システムはデフォルトのエンコードが何であれ使用します。私はあなたのシェル環境がこれらのプログラムの一つかもしれないと思っています。

関連する問題