在python中读取上标(NG²)和拉丁语-1的编码格式是什么?



我用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(最新的硬件,Python3.6(
上,curl cmd得到一个退出代码1,
没有人知道为什么。
由于我想摆脱旧的WinA并继续使用我的python脚本,所以我只是在VMWare Player12中的Fedora20来宾上
尝试这些脚本。
现在上标的这个问题只在 Fedora 系统上
(不在 WinA 上 - 由于卷曲问题,WinB 和 WinC 对我来说不再有任何意义(。

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

#!/usr/bin/python3.3
# -*- coding: utf-8 -*-

仅当我尝试将此行(带有上标 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')

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

首先,了解encode()采用 Unicode 字符串并将其转换为将字节值映射到 Unicode 代码点的某种表示形式。因此,要使用它,您必须在Unicode字符串上调用它。如果你在普通字符串上调用encode(),Python 会先尝试将其强制使用 Unicode。

因为这是 Python 2,所以你的原始字符串 (line( 是一个字节字符串,除非你告诉它编码是什么,否则不能可靠地强制到 Unicode。如果你不这样做,并选择默认强制,Python 假设ascii.

所以你必须从latin-1解码它才能得到Unicode:

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

在这种情况下,Unicode 和 Latin-1恰好具有相同的非 ASCII 字符的 8 位表示形式。但这只是一个方便的意外。它可能有所不同,这就是为什么您必须指定解码的原因。您现在有一个 unicode 字符串,您可以将其附加到'n'

>>> line.decode('latin-1')+"n"
u'Solo Fue Una Noche;NGxb2;Comienzos;9;2004n'

然后,您可以将此 Unicode 字符串编码回 Latin-1 以进行输出:

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

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

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

最新更新