在python中读上标(NG²)和latin1的编码格式是什么?

2024-04-23 18:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常用python(2.7)脚本从spotify读取拉丁播放列表。
到目前为止,拉丁语-1还不错。

但后来我遇到了一个像NG²这样的名字,这使得它无法工作
更多。

这是错误消息:

...
Solo Fue Una Noche;NG²;Comienzos;9;2004 (printed by a print() cmd)
Traceback (most recent call last):
  File "get_playlist-tracks.py", line 110, in <module>
    ndt.write(line+"\n").encode('latin-1')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)

我想,我需要拉丁语-1和上标的组合码。
对吗?有人知道哪个是对的吗?


谢谢你的回答!
嗯,有点复杂:

(同时)我有3个Win10(64位)安装(WinA、WinB、WinC)。
在WinA(最古老的一个,2011年,从Win7迁移过来)上,一切正常(Python3.4)
在winB和WinC(最新的HW,Python3.6)上,curl cmd得到一个退出代码1,
没人知道为什么 因为我想摆脱旧的WinA并继续使用python脚本,所以我只需在
VMWare Player12中的软呢帽来宾。
现在上标的问题只出现在Fedora系统上
(不在WinA上-WinB和WinC对我来说不再有任何意义,因为卷边问题)。

我在脚本中使用以下前两行:

^{pr2}$

只有当我试图将这一行(带上标2)写入文件时才会出现错误:

print (line)         # (works fine!)
ndt.write(line+"\n") # (this one not!)

我试着用.decode('utf-8')和.decode('latin-1')编写命令
但我总是收到同样的信息…

然后我尝试在python控制台中执行以下操作:

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> playlist_name = '/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt = open(playlist_name, 'w')
>>> ndt.write(line+"\n").decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'decode'
>>> ndt.write(line+"\n")
40
>>> line
'Solo Fue Una Noche;NG²;Comienzos;9;2004'
>>> playlist_name
'/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt.write(line)
39

代码

print ("playlist_contents_file:", playlist_name)

打印:

('playlist_contents_file:', u'/home/.../Python/PLLs/Sole_01a_tracks.txt')

Tags: namein脚本linengplaylistsolowrite
1条回答
网友
1楼 · 发布于 2024-04-23 18:37:08

问题不是上标2。它是拉丁语-1字符\xb2,不需要不同的编码。问题是您对已经是拉丁语-1的字节字符串调用encode()。在

首先,请理解encode()接受一个Unicode字符串,并将其转换为某种表示形式,将字节值映射到Unicode码位。所以要使用它,你必须在Unicode字符串上调用它。如果对普通字符串调用encode(),Python会首先尝试将其强制为Unicode。在

因为这是python2,所以原始字符串(line)是一个字节字符串,除非您告诉它编码是什么,否则无法可靠地将其强制转换为Unicode。如果不这样做,并且选择默认强制,Python将假定ascii。在

因此,您必须从latin-1中解码以获得Unicode:

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004'
>>> line.decode('latin-1')
u'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004'

在本例中,Unicode和Latin-1恰好具有相同的非ascii字符的8位表示形式。但那只是一个意外。它可能不同,这就是为什么你必须指定解码。现在有了一个unicode字符串,可以将'\n'附加到该字符串:

^{pr2}$

然后,您可以将这个Unicode字符串编码回拉丁语-1以输出:

>>> (line.decode('latin-1')+"\n").encode('latin-1')
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004\n'

但是对于你正在做的事情,你根本不需要encode()。你说是从Spotify得到了拉丁语-1。你希望你的输出是拉丁语-1。所以您只需将"\n"附加到输入字符串并写出它。在

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line + "\n"
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004\n'
>>> ndt.write(line+"\n")

相关问题 更多 >