迷失编码(贝壳和口音)

7se*_*seb 5 python shell encoding diacritics

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

Linux2上的Python 2.7.2+(默认,2011年10月4日,20:03:08)[GCC 4.6.1]

我有像éà这样的口音.我的脚本使用utf-8编码

#!/usr/bin/python
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

用户可以使用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()
Run Code Online (Sandbox Code Playgroud)

在主循环'伪'shell中调用

while to_continue : 
    to_continue, feedback = action( unicode(rlinput(u'todo > '),'utf-8') )
    os.system('clear')
    print T, u"\n" + feedback
Run Code Online (Sandbox Code Playgroud)

数据作为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')
Run Code Online (Sandbox Code Playgroud)

所以在shell文件中:

feedback = jaune + str(t).decode('utf-8') + vert + u" supprimée"
Run Code Online (Sandbox Code Playgroud)

这就是我意识到我可能完全错误的编码/解码.所以我试着直接在rlinput中解码但是失败了.我在stackoverflow中读了一些帖子,重新阅读http://docs.python.org/library/codecs.html 等待我的python书,我迷路了:/

我想有很多不好的代码,但我的问题只与编码问题有关.你可以在这里找到的代码:(法语大多数意见,对不起这对使用的personnal和我是一个初学者,你还需要yapsy - http://yapsy.sourceforge.net/)(然后配置路径,然后在py_todo:./ todo_shell.py):http://bit.ly/rzp9Jm

wbe*_*rry 2

所有 Unix 系统上的标准输入和输出都是基于字节的。这就是为什么你必须调用unicode函数来获取它们的字符串。解码错误表明传入的字节不是有效的 UTF-8。

基本上,问题在于 UTF-8 编码的假设,这是无法保证的。unicode通过将调用中的编码更改为'ISO-8859-1'或将终端模拟器的字符编码更改为 UTF-8 来确认这一点。(Putty 在“翻译”菜单中支持此功能。)

如果上述实验证实了这一点,那么您的挑战是支持用户的区域设置并推断出正确的编码,或者可能让用户在命令行参数或配置中声明编码。环境$LANG变量是在没有显式声明的情况下可以做的最好的事情,我发现它不能很好地指示所需的字符编码。