繁体   English   中英

python:相同的字符,不同的行为

[英]python :same character, different behavior

我正在使用Python 2.7.9从Postgres DB中提取的列表中生成文件名。 在此列表中,带有特殊字符的单词。 通常,我使用''.join()来记录名称并将其发射到我的加载器中,但是我只有一个要识别的名称。 .py是为utf-8编码设置的,但这些单词是葡萄牙语,我认为是latin-1编码。

from pydub import AudioSegment
from pydub.playback import play
templist = ['+ Orégano','- Búfala','+ Rúcola']
count_ins = (len(templist)-1)
while (count_ins >= 0 ):
    kot_istructions = AudioSegment.from_ogg('/home/effe/voice_orders/Voz/'+"".join(templist[count_ins])+'.ogg')
    count_ins-=1
    play(kot_istructions)

前两个文件已加载:

/home/effe/voice_orders/Voz/+ Orégano.ogg

/home/effe/voice_orders/Voz/- Búfala.ogg

第三个应该是:

/home/effe/voice_orders/Voz/+ Rúcola.ogg

但是python正在尝试加载

/home/effe/voice_orders/Voz/+ R\\xc3\\xbacola.ogg

为什么只是这个? 我尝试使用normalize()删除重音符号,但是由于这是字符串,因此该方法无效。 打印效果很好,因为数据库更新。 只是文件名创建不能按预期方式工作。 建议?

似乎根本原因可能是数据库中这些名称的编码不一致。

如果您运行:

>>> 'R\xc3\xbacola'.decode('utf-8')

你得到

u'R\xfacola'

实际上是Python unicode ,可以正确表示名称。 那你该怎么办? 虽然这是一种非常不干净的编程风格,但是您可以播放.encode()/.decode() whackamole,在其中try使用utf-8解码db中的原始字符串,但失败了,则是latin-1 它看起来像这样:

try:
    clean_unicode = dirty_string.decode('utf-8')
except UnicodeDecodeError:
    clean_unicode = dirty_string.decode('latin-1')

通常,始终在您自己的源代码中使用干净的unicode对象,并且仅在保存后转换为编码。 另外,不要让人们在不指定编码的情况下将数据插入数据库,因为这将首先使您避免出现此问题。

希望有帮助!

解决:文件有问题。 删除并重新构建它即可完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM