首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CL上Python工具Unidecode的编码问题

CL上Python工具Unidecode的编码问题
EN

Stack Overflow用户
提问于 2014-02-02 11:53:42
回答 2查看 283关注 0票数 1

我需要将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时没有。

你们有什么主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-02 12:36:29

当您在终端中键入‘èe’时,虽然您看到了‘èe’,但终端看到的是字节。如果终端编码是utf-8,那么它会看到字节。

代码语言:javascript
复制
In [2]: 'äèß'
Out[2]: '\xc3\xa4\xc3\xa8\xc3\x9f'

所以当你键入

代码语言:javascript
复制
python -c "from unidecode import *; print unidecode(u'äèß')"

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

代码语言:javascript
复制
python -c "from unidecode import *; print unidecode(u'\xc3\xa4\xc3\xa8\xc3\x9f')"

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

代码语言:javascript
复制
In [28]: print(u'\xc3\xa4\xc3\xa8\xc3\x9f')
äèÃ

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

  1. 让终端将äèß更改为\xc3\xa4\xc3\xa8\xc3\x9f,然后将其解码为utf-8: % python -c“从unidecode导入*;打印unidecode(‘utf_8’)”
  2. 声明一个编码,如NehalJ.Wani的解决方案所示: % python -c“#编码: utf8 >从unidecode导入*;打印unidecode(u‘èß’)” 但是,这需要在两行上编写命令。
  3. 由于u'äèß等同于u'\xe4\xe8\xdf',所以可以通过传递u'\xe4\xe8\xdf'来避免这个问题: % python -c“从unidecode导入*;打印unidecode(u'\xe4\xe8\xdf')” 这样做的问题(很明显)是,您必须计算出十六进制代码的点值。
  4. 或者,您可以按名称指定unicode: % python -c“从unidecode进口*;打印unidecode(u‘\n\n{拉丁文小写字母A与SHARP }}\N{拉丁文小写字母E带GRAVE}\N{拉丁文小写字母SHARP S}')”
票数 0
EN

Stack Overflow用户

发布于 2014-02-02 12:09:49

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

代码语言:javascript
复制
#!/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]$ 

要解决这个问题,您可以:

代码语言:javascript
复制
#!/bin/python
#coding: utf8
from unidecode import *; print unidecode(u'äèß')

[Wani@Linux tmp]$ python tmp.py
aeess
[Wani@Linux tmp]$

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

代码语言:javascript
复制
[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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21510260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档