【问题标题】:Another python unicode error另一个python unicode错误
【发布时间】:2013-07-26 00:19:56
【问题描述】:

我遇到了诸如

之类的错误
UnicodeEncodeError('ascii', u'\x01\xff \xfeJ a z z', 1, 2, 'ordinal not in range(128)'

我也得到了诸如

之类的序列
u'\x17\x01\xff \xfeA r t   B l a k e y'

我将 \x01\xff\xfe 识别为 BOM,但如何将它们转换为明显的输出(Jazz 和 Art Blakey)?

这些来自读取音乐文件标签的程序。

我尝试了各种编码,例如 s.encode('utf8'),以及各种解码后编码,但均未成功。

根据要求:

from hsaudiotag import auto
inf = 'test.mp3'
song = auto.File(inf)
print song.album, song.artist, song.title, song.genre

> Traceback (most recent call last):   File "audio2.py", line 4, in
> <module>
>     print song.album, song.artist, song.title, song.genre   File "C:\program files\python27\lib\encodings\cp437.py", line 12, in encode
>     return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode character u'\xfe' in
> position 4 : character maps to <undefined>

如果我将打印语句更改为

with open('x', 'wb') as f:
    f.write(song.genre)

我明白了

Traceback (most recent call last):
  File "audio2.py", line 6, in <module>
    f.write(song.genre)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xff' in position 1:
ordinal not in range(128)

【问题讨论】:

  • 这可能有助于显示您的代码,从您获得原始字节输入的位置到您收到此错误的位置。并显示整个堆栈跟踪。
  • unicode 是运行名为 hsaudiotag 的音乐文件标签读取程序的直接输出。错误是由 print 或 write 语句生成的。我也得到 UnicodeEncodeError: 'ascii' codec can't encode character u'\xff' in position 1: ordinal not in range(128)
  • 请完全按照我的要求去做。我不在乎这是从什么输出的。
  • 我会将此报告为 hsaudiotag 中的错误;这些值应该永远以这种方式解码。
  • @IgnacioVazquez-Abrams 我希望我错过了一些 unicode 问题。唉,就我的目的而言,hsaudiotag 比替代品要好得多,而且似乎没有得到积极维护。我想摆脱最初的十六进制字符和空格

标签: python unicode python-unicode


【解决方案1】:

对于您的实际问题,您需要将字节而不是字符写入文件。调用:

f.write(song.genre.encode('utf-8'))

你不会得到错误。您可以使用io.open 来获取可以写入的字符流,并自动完成编码,即:

with io.open('x', 'wb', encoding='utf-8') as f:
    f.write(song.genre)

将 Unicode 输入控制台可能有些困难(尤其是在 Windows 下)——请参阅 PrintFails

但是,正如 cmets 中所讨论的,您所拥有的看起来不像是一个有效的标签值......它看起来更像是一个损坏的 ID3v2 帧数据块,它可能无法恢复。我不知道这是您的标签阅读库中的错误还是您只是有一个带有垃圾标签的文件。

【讨论】:

  • 虽然我没有得到任何错误,但结果是 'ÿ þJ a z z'(或 '\x01\xc3\xbf \xc3\xbeJ a z z')并没有好多少.正如 cmets 中所讨论的,该错误似乎在标签库中。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2021-09-01
  • 2011-03-14
相关资源
最近更新 更多