Python来显示特殊字符

Python来显示特殊字符,python,encoding,special-characters,python-unicode,Python,Encoding,Special Characters,Python Unicode,我知道有很多关于这个问题的线程,但我还没有找到一个解决我的问题 我试图打印字符串,但打印时不会显示特殊字符(例如æ、ø、å、ö和ü)。当我使用repr()打印字符串时,我得到的是: u'vond\xc3\xbc'和u'\xc3\x96berg' 有人知道我如何把它转换成vondu和Öberg?对我来说,不忽略这些字符很重要,例如myStr.encode(“ascii”,“忽略”) 编辑 这是我使用的代码。我使用BeautifulSoup来浏览网站。表()中单元格()的内容被放入变量名称中。这是包

我知道有很多关于这个问题的线程,但我还没有找到一个解决我的问题

我试图打印字符串,但打印时不会显示特殊字符(例如æ、ø、å、ö和ü)。当我使用
repr()
打印字符串时,我得到的是:

u'vond\xc3\xbc'
u'\xc3\x96berg'

有人知道我如何把它转换成
vondu
Öberg
?对我来说,不忽略这些字符很重要,例如
myStr.encode(“ascii”,“忽略”)

编辑

这是我使用的代码。我使用BeautifulSoup来浏览网站。表(
)中单元格(
)的内容被放入变量
名称中。这是包含我无法打印的特殊字符的变量

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
web=urllib2.urlopen(url);
汤=BeautifulSoup(网络)
表=汤。查找所有(“表”)
场景_表=[2,3,6,7,10]
场景索引=0
#迭代我们要使用的对象
对于场景_表中的场景_表:
i=0
#迭代以查找时间和名称
对于表[scene\u table]中的td,查找所有(“td”):
如果i%2==0:#td包含时间
时间=删除空白(td.get\u text())
else:#td包含名称
name=remove_whitespace(td.get_text())#这是包含“无意义”的变量
打印“%s:%s”%(时间、名称)
i+=1
场景索引+=1

许多语言中的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
欲了解更多信息:


在继续之前,您应该真正阅读这些链接并了解正在发生的事情。然而,如果你现在确实需要一些有用的东西,你可以使用这个我不好意思公开发布的骇人听闻的黑客:

def convert_fake_unicode_to_real_unicode(string):
    return ''.join(map(chr, map(ord, string))).decode('utf-8')

字符串的内容不是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ü
>>> 
编辑:

>>打印'\xc3\x96berg'#没有unicode标识符,因为它是UTF-8编码的字符串,所以工作正常
Öberg
>>>print u'\xc3\x96berg'#具有unicode标识符,意味着print现在使用unicode字符集,输出奇怪的东西
阿尔贝格
#查看不同的对象类型:
>>>类型('\xc3\x96berg')
>>>类型(u'\xc3\x96berg')
>>>“\xc3\x96berg”.decode('utf-8')#此命令将utf-8转换为unicode,请查看输出中的unicode标识符
u'\xd6berg'
>>>unicode('\xc3\x96berg',utf-8')#这也做了同样的事情
u'\xd6berg'
>>>unicode(u'foo-bar',utf-8')#尝试将unicode字符串转换为unicode将按预期失败
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持对Unicode进行解码

预防胜于治疗。你需要的是找出垃圾是如何产生的。请编辑您的问题以显示创建它的代码,然后我们可以帮助您修复它。看起来有人做了:

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编码的。请更新您的问题以向我们显示url

如果你看不出来,就看;看起来您需要使用:

BeautifulSoup(web, from_encoding='utf8')

您的控制台是否设置为UTF-8模式?我正在使用Mac OS X中的默认终端,并且UTF-8已启用。当我打印字符串时没有
repr()
,这就是我得到的:
Ãberg
,但我想要的是
Öberg
。如果我使用
decode('utf-8')
,我将得到一个
unicodeincodeerror
。如果字符串是UTF-8,它不应该写一个
Ö
而不是
Ã
?您首先要弄清楚这些变量是如何成为
unicode
类型的。它们实际上是用ascii编码的UTF-8,因此它们应该是正确的
str
-1类型(1)join/map/chr/map/ord mess(2)“UTF-8用ascii编码”当我打印字符串时没有
repr()
,这是我得到的:
Ãberg
,但我想要的是
Öberg
。如果字符串是UTF-8,它不应该写一个
Ö
而不是
Ã
?如果我使用
unicode
,我会得到以下错误:
TypeError:不支持解码unicode
。您仍然使用unicode标识符(
u'foo'
)。它是一个UTF-8编码的字符串,通过使用unicode标识符,可以说它是unicode,而不是unicode。这就是为什么你得到的是
Ã
而不是
Ö
。放下标识符,你就没事了。我会更新我的答案,让它更清楚。@SimonBS我更新了我的答案。你仍然应该读这个链接:我只是读了这个链接。不过,我还是有点困惑。我有我的字符串,
myStr
,它的类型是
unicode
,这意味着它有unicode标识符。我想删除此标识符并使用UTF-8编码的字符串。我该怎么做?我原以为它会很简单,比如
myStr.encode(“utf-8”)
,它返回类型为
str
的对象,但这会抛出一个
UnicodeDecodeError
错误。@SimonBS应该可以工作。你能在你的问题中或在上发布这个例子吗?我已经更新了我的问题,以显示我使用的代码。我使用BeautifulSoup来浏览网站。然后将表中单元格的内容放入变量
name
。这是包含我无法打印的特殊字符的变量。使用
name.encode('latin1')。decode('utf8')
解决了我的所有问题。角色看起来很完美,但你说这不是正确的方式吗?@SimonBS:重读我答案的第一句话。了解你真正的问题并及时解决总是更好的
BeautifulSoup(web, from_encoding='utf8')