在Python中阅读SubRip文件,获得 预期é

时间:2015-10-16 00:01:11

标签: python unicode python-unicode

该字符串是西班牙语字符串:Am rica

它应该是一个ê(代字号)但由于某种原因我得到了 。

我已经看过使用.decode和.encode也使用了Python中的unicode()方法,但没有任何东西可以提供我想要的输出。

使用代字号将此字符转换为正确的“e”的最佳方法是什么?

这甚至有意义吗?我可以从convert转换为ê??

我在包含Am rica的文件上运行了一个hexdump,这就是我找到的:

(env)bvh331-apvpsv01:active admin$ hexdump test.txt 
0000000 41 6d ef bf bd 72 69 63 61 0a                  
000000a

我还运行了一个文件-I来获取char_set:

alexdaro@hplive-us163783-la-silo01 Desktop $ file -I tmp.es.srt
tmp.es.srt: text/plain; charset=utf-8

2 个答案:

答案 0 :(得分:0)

the wikipedia article on SubRip

  

SubRip assert文件格式实际上仅支持Microsoft Windows文本编码默认值CP-1252(通常但不正确地称为ANSI)。可以添加Unicode字节顺序标记以支持任何Unicode编码,因为UTF-8与CP-1252的兼容性是首选。但是,由于与使用的商业字体相关的许可成本,许多嵌入式基于硬件的播放器仅支持非Unicode字体。

但是,此字符串无法在CP-1252中按需要呈现:

.srt

因此,大概是您从一个较大的文件中摘录了这个内容,该文件以BOM(字节顺序标记)开头,表示其编码,但丢弃了该BOM(以及编码信息)。作为替代理论,原始文件(以及生成和读取它的软件)可能只是不符合SubRip标准,或者已经生成用于非Unicode字体集的硬件。

答案 1 :(得分:0)

序列“ef bf bd”是U + FFFD(REPLACEMENT CHARACTER)的UTF-8,即一个特殊代码,显示为“ ”,如您的问题中所述。因此,某些东西(Python?)必须用这个代码替换原始的char。所以你的终端似乎没问题。

UTF-8中的'é'字符U + 00E9(LATIN SMALL LETTER E WITH ACUTE)将改为“c3 a9”。

可以想象您的原始字幕可能被编码为CP1252,其中“e”由代码0xe9表示。由于下一个字节是0x72('r'),您的解析器可能已将0xe9解释为不完整的UTF-8序列,因此将“e9”替换为“ef bf bd”(REPLACEMENT CHARACTER)。