我知道有很多关于这个问题的线索,但我没有设法找到解决我问题的线索。
我正在尝试打印一个字符串但是在打印时它没有显示特殊字符(例如æ,ø,å,ö和ü)。当我使用repr()
打印字符串时,这就是我得到的:
u'Von D\xc3\xbc'
和u'\xc3\x96berg'
有谁知道我如何将其转换为Von Dü
和Öberg
?对我来说重要的是这些字符不会被忽略,例如myStr.encode("ascii", "ignore")
。
修改
这是我使用的代码。我用BeautifulSoup来抓一个网站。表(<td>
)中的单元格(<table>
)的内容将放入变量name
中。这是包含我无法打印的特殊字符的变量。
web = urllib2.urlopen(url);
soup = BeautifulSoup(web)
tables = soup.find_all("table")
scene_tables = [2, 3, 6, 7, 10]
scene_index = 0
# Iterate over the <table>s we want to work with
for scene_table in scene_tables:
i = 0
# Iterate over < td> to find time and name
for td in tables[scene_table].find_all("td"):
if i % 2 == 0: # td contains the time
time = remove_whitespace(td.get_text())
else: # td contains the name
name = remove_whitespace(td.get_text()) # This is the variable containing "nonsense"
print "%s: %s" % (time, name,)
i += 1
scene_index += 1
答案 0 :(得分:6)
预防胜于治疗。你需要的是找出如何创建垃圾。请编辑您的问题以显示创建它的代码,然后我们可以帮助您解决问题。看起来有人做过:
your_unicode_string = original_utf8_encoded_bytestring.decode('latin1')
解决方法是简单地反转过程,然后解码。
correct_unicode_string = your_unicode_string.encode('latin1').decode('utf8')
更新根据您提供的代码,可能的原因是网站声明它是以ISO-8859-1
(又名latin1
)编码的,但实际上它是以UTF-8编码。请更新您的问题以向我们显示网址。
如果您无法展示,请阅读the BS docs;看起来你需要使用:
BeautifulSoup(web, from_encoding='utf8')
答案 1 :(得分:3)
许多语言的Unicode支持令人困惑,因此您的错误在这里是可以理解的。这些字符串是UTF-8字节,如果你将u
放在前面,它将正常工作:
>>> err = u'\xc3\x96berg'
>>> print err
Ã?berg
>>> x = '\xc3\x96berg'
>>> print x
Öberg
>>> u = x.decode('utf-8')
>>> u
u'\xd6berg'
>>> print u
Öberg
欲了解更多信息:
http://www.joelonsoftware.com/articles/Unicode.html
http://docs.python.org/howto/unicode.html
在继续操作之前,您应该真正阅读这些链接并了解正在发生的事情。但是,如果你绝对需要一些今天有用的东西,你可以使用这个可怕的黑客,我很尴尬地公开发布:
def convert_fake_unicode_to_real_unicode(string):
return ''.join(map(chr, map(ord, string))).decode('utf-8')
答案 2 :(得分:1)
字符串的内容不是unicode,它们是UTF-8编码的。
>>> print u'Von D\xc3\xbc'
Von Dü
>>> print 'Von D\xc3\xbc'
Von Dü
>>> print unicode('Von D\xc3\xbc', 'utf-8')
Von Dü
>>>
编辑:
>>> print '\xc3\x96berg' # no unicode identifier, works as expected because it's an UTF-8 encoded string
Öberg
>>> print u'\xc3\x96berg' # has unicode identifier, means print uses the unicode charset now, outputs weird stuff
Ãberg
# Look at the differing object types:
>>> type('\xc3\x96berg')
<type 'str'>
>>> type(u'\xc3\x96berg')
<type 'unicode'>
>>> '\xc3\x96berg'.decode('utf-8') # this command converts from UTF-8 to unicode, look at the unicode identifier in the output
u'\xd6berg'
>>> unicode('\xc3\x96berg', 'utf-8') # this does the same thing
u'\xd6berg'
>>> unicode(u'foo bar', 'utf-8') # trying to convert a unicode string to unicode will fail as expected
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: decoding Unicode is not supported