在CL上使用Python工具Unidecode的编码问题

时间:2014-02-02 11:53:43

标签: python encoding command-line utf-8

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

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

  

LANG = “de_DE.UTF-8”

     

LC_COLLATE = “de_DE.UTF-8”

     

LC_CTYPE = “de_DE.UTF-8”

     

LC_MESSAGES = “de_DE.UTF-8”

     

LC_MONETARY = “de_DE.UTF-8”

     

LC_NUMERIC = “de_DE.UTF-8”

     

LC_TIME = “de_DE.UTF-8”

     

LC_ALL = “de_DE.UTF-8”

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

你们有个主意吗?

2 个答案:

答案 0 :(得分:0)

如果你尝试在文件中写这个:

#!/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]

进一步阅读:Correct way to define Python source code encoding

答案 1 :(得分:0)

当您在终端中键入'äèß'时,虽然您看到'äèß',但终端会看到字节。如果您的终端编码是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')
äèÃ

有很多方法可以解决这个问题,可能是为了方便起见:

  1. 让终端将äèß更改为\xc3\xa4\xc3\xa8\xc3\x9f然后 将其解码为utf-8

    % python -c "from unidecode import *; print unidecode('äèß'.decode('utf_8'))"
    aess
    
  2. 声明编码,如Nehal J. Wani的解决方案所示:

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

    这需要在两行上写命令。

  3. 由于u'äèß相当于u'\xe4\xe8\xdf',您可以避免 通过传递u'\xe4\xe8\xdf'来解决问题:

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

    这样做(显然)的问题是你必须要弄清楚 超出十六进制代码点值。

  4. 或者,您可以按名称指定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