我的文件是unicode。但是,出于某种原因,我想在删除ascii中无法识别的任何字符时将其更改为plain 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字符串很好。
答案 0 :(得分:3)
我假设你的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'
答案 1 :(得分:1)
你需要解码它。如果你有一个文件
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
print“”。join(l)
答案 2 :(得分:1)
如果您的字符串中有Replacement character
(在Specials表中的代码点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'