提问者:小点点

CL上Python工具Unidecode的编码问题


我需要将unicode文件转换为ascii。如果ascii中不存在字母,则应将其转换为最接近的ascii表示形式。我正在使用Unidecode工具(https://pypi.python.org/pypi/Unidecode)。当我在CL的Python解释器中使用它时,它工作正常(因此,通过调用python然后导入库,然后打印解码后的单词,如下所示:print unidecode(u'äèß')

不幸的是,当我尝试直接在命令行上使用这个工具时(因此,通过从unidecode import*执行类似python-c"的操作;打印unidecode(u'äèß')",它只打印胡言乱语(A$?确切地说是A"A,即使它应该打印(并且在解释器中打印)aess)。这很烦人,我不知道如何解决这个问题。我认为这可能是由于我的终端编码错误,没有正确设置为utf-8或其他什么。然而,我终端中的locale打印了以下输出:

LANG="de_DE. UTF-8"

LC_COLLATE="de_DEUTF-8"

LC_CTYPE="de_DEUTF-8"

LC_MESSAGES="de_DEUTF-8"

LC_MONETARY="de_DEUTF-8"

LC_NUMERIC="de_DEUTF-8"

LC_TIME="de_DEUTF-8"

LC_ALL="de_DEUTF-8"

或者,可能是由于Python在命令行上的StdIn编码有问题?它在python解释器中给了我正确的输出,但是在调用python-c时没有。

你们有什么想法吗?


共2个答案

匿名用户

当您在终端中键入 'äèß' 时,尽管您看到了 'äèß', 终端看到了字节。如果您的终端编码是utf-8,那么它会看到字节

In [2]: 'äèß'
Out[2]: '\xc3\xa4\xc3\xa8\xc3\x9f'

所以当你打字的时候

python -c "from unidecode import *; print unidecode(u'äèß')"

在命令行,终端(假设utf-8编码)看到

python -c "from unidecode import *; print unidecode(u'\xc3\xa4\xc3\xa8\xc3\x9f')"

这不是你打算发送给Python的unicode。

In [28]: print(u'\xc3\xa4\xc3\xa8\xc3\x9f')
äèÃ

有许多方法可以解决这个问题,也许是为了方便:

>

  • 让终端将äèρ更改为\xc3\xa4\xc3\xa8\xc3\x9f,然后将其解码为utf-8

    % python -c "from unidecode import *; print unidecode('äèß'.decode('utf_8'))"
    aess
    

    声明一个编码,如Nehal J. Wani的解决方案所示:

    % python -c "#coding: utf8
    > from unidecode import *; print unidecode(u'äèß')" 
    aess
    

    但是,这需要在两行上编写命令。

    由于u'äèρ等价于u'\xe4\xe8\xdf',您可以通过传递u'\xe4\xe8\xdf'来避免问题:

    % python -c "from unidecode import *; print unidecode(u'\xe4\xe8\xdf')"
    aess
    

    这样做的问题(显然)是您必须找出十六进制代码点值。

    或者,您可以按名称指定unicode:

    % python -c "from unidecode import *; print unidecode(u'\N{LATIN SMALL LETTER A WITH DIAERESIS}\N{LATIN SMALL LETTER E WITH GRAVE}\N{LATIN SMALL LETTER SHARP S}')"
    aess
    

  • 匿名用户

    如果您尝试将其写入文件:

    #!/bin/python
    from unidecode import *
    print unidecode(u'äèß')
    
    [Wani@Linux tmp]$ python tmp.py 
    File "tmp.py", line 1
    SyntaxError: Non-ASCII character '\xc3' in file tmp.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    [Wani@Linux tmp]$ 
    

    要解决此问题,您需要:

    #!/bin/python
    #coding: utf8
    from unidecode import *; print unidecode(u'äèß')
    
    [Wani@Linux tmp]$ python tmp.py
    aeess
    [Wani@Linux tmp]$
    

    因此,您需要像这样从命令行调用:

    [Wani@Linux tmp]$ python -c "#coding: utf8
    from unidecode import *; print unidecode(u'äèß')"
    aeess
    [Wani@Linux tmp]$ python -c "$(echo -e "#coding: utf8\nfrom unidecode import *; print unidecode(u'äèß')")"
    aeess
    [Wani@Linux tmp]
    

    进一步阅读:定义源代码编码Python正确方法