s = "мистика"
`touch #{s}`
`cat #{s}`
`cat < #{s}`
任何人都能说出它的代码失败的原因吗?随着
sh:无法打开ми тика:没有这样的文件
但是这个代码工作正常
s = "работает"
`touch #{s}`
`cat #{s}`
`cat < #{s}`
问题是只有当俄语符号'с'在单词中并且与symobol'&lt;'
时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
答案 0 :(得分:1)
这是dash
中的一个错误,默认情况下Debian使用的shell(符号链接/bin/sh
导致/bin/dash
;而python的os.system
使用sh
。可能也使用sh
。 dash
无法正确解析8位文本,包括UTF-8。要解决您的问题,请将其替换为bash
:
sudo dpkg-reconfigure dash
并选择“否”。这样系统将使用bash
作为/bin/sh
shell,它可以处理UTF-8。
答案 1 :(得分:0)
以下对我有用,你试过这种方式吗?
s="мистика"
touch $s
在bash中,你引用一个加在美元符号前面的变量。
答案 2 :(得分:0)
在每个示例中,您正在执行shell命令。作为第一步,我将确保您的shell命令在您直接输入时按预期执行:
touch мистика
cat мистика
cat < мистика
如果你在shell中遇到错误,它是两种可能性之一:shell命令不理解字符编码,或者文件名需要引号来区分它。
Ruby 1.9理解字符集编码,这是Ruby 1.8没有的。您需要做一些研究来确定shell环境使用的字符编码。完成后,您将以常规字符串创建命令:
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)。在这些情况下,系统将使用默认编码。我怀疑你的shell环境可能是其中一个程序。
答案 3 :(得分:-2)
使用ruby 1.9它在String对象中有force_encoding方法