迷失编码(贝壳和口音)

时间:2011-11-03 09:31:01

标签: python shell encoding diacritics

我遇到编码问题。 我正在使用版本

  

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

2 个答案:

答案 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__