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

2024-03-28 21:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要把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-8或其他什么。但是,在我的终端中,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时却没有。在

你们有主意吗?在


Tags: 工具命令行pypi终端编码asciiunicodede
2条回答

如果您尝试在文件中写入:

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

要解决此问题,请执行以下操作:

^{pr2}$

所以,您需要像这样从命令行调用:

^{3}$

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

当您在终端中输入“äß”,虽然您看到的是“äß”,但终端会看到字节。如果您的终端编码是utf-8,那么它会看到字节

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

所以当你打字的时候

^{pr2}$

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

^{3}$

这不是您打算发送给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
    

相关问题 更多 >