由于我不清楚的原因,mp4 文件用作标签名称的某些字段包含不可打印的字符,至少是 mutagen 看到它们的方式。给我带来麻烦的是'\xa9wrt'
,这是作曲家字段的标签名称(!?)。
如果我'\xa9wrt'.encode('utf-8')
从 Python 控制台运行,我会得到
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa9 in position 0: invalid start byte
我正在尝试从使用一些面向未来的 Python 文件中访问此值,包括:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
我什至不知道如何将字符串输入'\xa9wrt'
到我的代码文件中,因为该文件中的所有内容都被解释为 utf-8,而我感兴趣的字符串显然不能用 utf-8 编写。此外,当我将字符串'\xa9wrt'
放入变量(例如,来自诱变剂)时,很难使用。例如,"{}".format(the_variable)
失败,因为"{}"
被解释为u"{}"
,它再次尝试将字符串编码为 utf-8。
只是天真地输入'\xa9wrt'
给了我u'\xa9wrt'
,这是不一样的,而且我尝试过的其他东西都没有奏效:
>>> u'\xa9wrt' == '\xa9wrt'
False
>>> str(u'\xa9wrt')
'\xc2\xa9wrt'
>>> str(u'\xa9wrt') == '\xa9wrt'
False
请注意,此输出来自控制台,似乎我可以输入非 Unicode 文字。我在 Mac OS 上使用 Spyder,带有sys.version = 2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09)\n[GCC 4.0.1 (Apple Inc. build 5493)]
.
如何在 Unicode 世界中使用此字符串?utf-8 不能这样做吗?
更新: 谢谢@tsroten 的回答。它加深了我的理解,但我仍然无法达到我想要的效果。这是一个更尖锐的问题形式:我怎样才能用'??'到达两条线 在他们不诉诸我正在使用的那些技巧的情况下?
请注意,str
我正在使用的东西是由图书馆交给我的。我必须接受它作为那种类型
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
tagname = 'a9777274'.decode('hex') # This value comes from a library as a str, not a unicode
if u'\xa9wrt' == tagname:
# ??: What test could I run that would get me here without resorting to writing my string in hex?
print("You found the tag you're looking for!")
else:
print("Keep looking!")
print(str("This will work: {}").format(tagname))
try:
print("This will throw an exception: {}".format(tagname))
# ??: Can I reach this line without resorting to converting my format string to a str?
except UnicodeDecodeError:
print("Threw exception")
更新 2:
我认为您(@tsroten)构造的任何字符串都不等于我从诱变剂中获得的字符串。该字符串似乎仍然会导致问题:
>>> u = u'\xa9wrt'
>>> s = u.encode('utf-8')
>>> s2 = '\xa9wrt'
>>> s3 = 'a9777274'.decode('hex')
>>> s2 == s
False
>>> s2 == s3
True
>>> match_tag(s)
We have a match! tagname == ©wrt
Look! We printed tagname and no exception was raised.
>>> match_tag(s2)
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa9 in position 0: invalid start byte