【问题标题】:How can I change unicode to ascii and drop unrecognized characters如何将 unicode 更改为 ascii 并删除无法识别的字符
【发布时间】:2015-01-09 18:12:18
【问题描述】:

我的文件是 unicode。但是,出于某种原因,我想将其更改为纯 ascii,同时删除任何在 ascii 中无法识别的字符。例如,我想将 u'This is a string�' 更改为 'This is a string'。以下是我用来执行此操作的代码。

ascii_str = unicode_str.encode('ascii', 'ignore')

但是,我仍然收到以下烦人的错误。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xf3 in position 0: 
  ordinal not in range(128)

我该如何解决这个问题?我对普通的 ascii 字符串很好。

【问题讨论】:

  • print repr(unicode_str) 也请发布您的完整回溯
  • 看看我的解决方案。我认为用正确的编码读取文件(如果有的话?)是处理这个问题的最佳起点。
  • 我强烈推荐这个库来将 Unicode 转换为 ASCII:pypi.python.org/pypi/Unidecode

标签: python string unicode ascii unicode-string


【解决方案1】:

我假设你的 unicode_str 是一个真正的 unicode 字符串。

>>> u"\xf3".encode("ascii", "ignore")
''

如果不使用这个

>>> "\xf3".decode("ascii", "ignore").encode("ascii")

最好的办法总是找出你处理的编码,然后再解码。所以你有一个正确格式的 unicode 字符串。这意味着从unicode_str 开始,要么是一个真正的unicode 字符串,要么用正确的codec 读取它。我假设有一个文件。所以最好的是:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

另一种绝望的方法是:

>>> import string
>>> a = "abc\xf3abc"
>>> "".join(b for b in a if b in string.printable)
'abcabc'

【讨论】:

  • 这个。错误消息表示解码错误,而不是编码错误。
【解决方案2】:

您需要对其进行解码。如果你有文件

with open('example.csv', 'rb') as f:
    csv = f.read().decode("utf-8")

如果你想解码一个字符串,你可以这样做

data.decode('UTF-8')

更新 您可以使用ord() 获取每个字符的ASCII码

d=u'This is a string'
l=[ord(s) for s in d.encode('ascii', 'ignore')]
print l

如果需要拼接,可以使用join

打印 "".join(l)

【讨论】:

  • 解码后如何转成ascii,忽略ascii不能识别的字符?
  • @MetallicPriest 您可以使用 ord() 来获取每个字符的代码 ascii。我已经更新了帖子。
【解决方案3】:

由于您的字符串中有一个 Replacement character(在特殊表中的代码点 U+FFFD 的 Unicode 标准中找到的符号),您需要在解码之前为您的解释器指定它,使用 add u at the leading of your string

>>> unicode_str=u'This is a string�'
>>> unicode_str.encode('ascii', 'ignore')
'This is a string'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2017-07-17
    相关资源
    最近更新 更多