我遇到编码问题。 我正在使用版本
Python 2.7.2+(默认,2011年10月4日,20:03:08) linux2上的[GCC 4.6.1]
我有像éà这样的口音。 我的脚本使用utf-8编码
#!/usr/bin/python
# -*- coding: utf-8 -*-
用户可以使用raw_input()和。
键入字符串def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text( prefill))
try:
return raw_input(prompt)
finally:
readline.set_startup_hook()
在主循环'伪'shell中调用
while to_continue :
to_continue, feedback = action( unicode(rlinput(u'todo > '),'utf-8') )
os.system('clear')
print T, u"\n" + feedback
数据存储为文件中的pickle。
我设法让应用程序正常工作,但最终得到像
这样的蠢事核心档案:
class Task()
...
def __str__(self):
r = (u"OK" if self._done else u"A faire").ljust(8) + self.getDesc()
return r.encode('utf-8')
以及shell文件中的内容:
feedback = jaune + str(t).decode('utf-8') + vert + u" supprimée"
这就是我意识到编码/解码可能完全错误的地方。 所以我试着直接在rlinput中解码但是失败了。 我在stackoverflow中读了一些帖子,重新阅读http://docs.python.org/library/codecs.html 等我的python书,我迷路了:/
我猜有很多不好的代码,但我的问题只与编码问题有关。 你可以在这里找到代码:(大多数评论用法语,很遗憾,这是为了个人使用,我是初学者,你也需要yapsy - http://yapsy.sourceforge.net/)(然后配置路径,然后在py_todo中:./ todo_shell .py):http://bit.ly/rzp9Jm
答案 0 :(得分:2)
标准输入和输出基于字节,适用于所有Unix系统。这就是为什么你必须调用unicode
函数来获取它们的字符串。解码错误表示进入的字节无效UTF-8。
基本上,问题是假设UTF-8编码,这是不能保证的。通过更改unicode
对'ISO-8859-1'
的调用中的编码,或将终端模拟器的字符编码更改为UTF-8来确认这一点。 (Putty在“翻译”菜单中支持此功能。)
如果上述实验证实了这一点,那么您的挑战是支持用户的语言环境并推断出正确的编码,或者可能是让用户在命令行参数或配置中声明编码。 $LANG
环境变量是没有明确声明的最佳选择,我发现它是所需字符编码的不良指标。
答案 1 :(得分:0)
正如@wberry建议我检查编码:ok
$ file --mime-encoding todo_shell.py task.py todo.py
todo_shell.py: utf-8
task.py: utf-8
todo.py: utf-8
$ echo $LANG
fr_FR.UTF-8
$ python -c "import sys; print sys.stdin.encoding"
UTF-8
正如@eryksun建议解码用户输入(+编码之前提交的字符串)(如果我的记忆力良好,解决了一些问题)(稍后会深入测试):
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text( prefill.encode(sys.stdin.encoding) ))
try:
return raw_input( prompt ).decode( sys.stdin.encoding )
finally:
readline.set_startup_hook()
我仍然有问题,但我的问题没有明确定义,所以我无法得到明确的答案。 我现在感觉不那么迷失并且有搜索方向。 谢谢!
编辑:我用 unicode 替换了 str 方法,它杀死了一些(所有?)probs。感谢@eryksun的提示。 (这个链接帮助了我:Python __str__ versus __unicode__)