【问题标题】:Reading SubRip file in Python, getting � where é is expected在 Python 中读取 SubRip 文件,得到 é 预期的位置
【发布时间】:2015-10-16 00:01:10
【问题描述】:

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

它应该是 ê(波浪号),但由于某种原因,我得到了 �。

我已经研究过在 Python 中使用 .decode 和 .encode 以及 unicode() 方法,但没有什么能提供我想要的输出。

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

这有意义吗?我可以从 � 转换为 ê 吗??

我对包含 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

【问题讨论】:

  • 我们首先需要知道的是文件的编码。如果你不知道这个,那么这个问题就只能靠猜测了。
  • ...如果您想至少让猜测有依据,您可以包含 hexdump 输出,以便我们知道哪些特定字节用于对相关字符进行编码。
  • 1. ê 有一个抑扬符,而不是波浪号。 2. 西班牙语中不使用抑扬符。 3. 这个词不需要波浪号 - 它应该是América
  • ...当然,另一个问题是您的 终端 是否正确呈现 Python 解释器发出的内容。您的代码可能是 100% 完美的,但如果 Python 正在写出 UTF-8 并且您的终端正在呈现 Windows-1252,那么您的终端无论如何都无法正确打印发出的字符。
  • @TigerhawkT3 - 是的,谢谢你的澄清。我在文件上运行了 mediainfo,它显示的是:\n (env)bvh331-apvpsv01:active admin$ mediainfo tmp.es.srt General 全名:tmp.es.srt 格式:SubRip 文件大小:23.0 KiB 文本格式:SubRip 压缩模式:无损

标签: python unicode python-unicode


【解决方案1】:

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

UTF-8 中的“é”字符 U+00E9(带有锐音的拉丁小写字母 E)将改为“c3 a9”。

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

【讨论】:

    【解决方案2】:

    the wikipedia article on SubRip:

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

    但是,此字符串在 CP-1252 中未按预期呈现:

    >>> print '\x41\x6d\xef\xbf\xbd\x72\x69\x63\x61'.decode('cp1252')
    Am�rica
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2019-09-16
      • 2014-09-26
      • 2020-04-14
      • 2019-10-19
      相关资源
      最近更新 更多