【问题标题】:Convert Windows-1252 subtitle file to utf-8将 Windows-1252 字幕文件转换为 utf-8
【发布时间】:2020-02-29 20:44:30
【问题描述】:

我在 Ubuntu 机器上通过 VLC 播放器下载塞尔维亚语/波斯尼亚语/克罗地亚语字幕,并且必须不断手动将 æ、è 和 ð 等字符更改为 ć、č 和 đ 以便播放器正确渲染.我想制作一个可以为我做这件事的python3函数,但是我很想理解字符串编码和解码。

通过chardata.detect发现VLC播放器下载的.srt文件的编码是Windows-1252。所以现在,我做这样的事情:

import codecs

f = codecs.open('my_file.srt', 'r', encoding='Windows-1252')
data = f.read()
data_utf8 = data.encode('utf-8')
f.close()

问题是,当我将data 变量的内容打印到终端时,我可能会得到这样的片段: obožavam vaše。 但是,当我将data-utf8 变量的内容打印到终端时,同一个片段现在看起来像这样: obo\xc5\xbeavam va\xc5\xa1e。 这不是我所期望的。

此外,当我现在想将此数据保存到文件时

with open('my_utf8_file.srt', 'w') as f:
    f.write(data_utf8)

我收到TypeError: write() argument must be str, not bytes

谁能告诉我我做错了什么?

【问题讨论】:

  • 可能检测到的编码不正确,它并不总是有效。对于克罗地亚语,推荐的编码是东欧,而不是西欧。你可以试试 windows-1250 而不是 1252 吗?
  • 我用仅包含 obožavam vaše 的文件尝试了您的代码,该文件以 windows-1252 或 1250 编码,并且在这两种情况下都有效...您能提供字幕文件以便我尝试吗?
  • 你能分享srt的链接吗?也许您应该尝试使用Universal Encoding Detector 库。
  • data.encode('utf-8').decode(),然后尝试写。
  • 已经尝试了大部分这些东西,但结果我只是在写入文件时忘记使用二进制标志,因为 mousetail 在下面注意到。无论如何,谢谢你们!

标签: python ubuntu-18.04 vlc codec


【解决方案1】:

你必须使用:

with open('my_utf8_file.srt', 'wb') as f:
    f.write(data_utf8)

注意“b”,这会将文件标记为二进制文件,以便您可以写入字节(如.encode() 打印的)这也是它打印不同的原因。

或者,您可以执行以下操作:

with open('my_utf8_file.srt', 'w', encoding='utf-8') as f:
    f.write(data)

【讨论】:

    【解决方案2】:

    尝试使用chardet 来确定正确的文件编码。
    打开命令行并输入:

    > chardetect Joker.BDRip.x264-AAA.cyr.srt
    Joker.BDRip.x264-AAA.cyr.srt: windows-1251 with confidence 0.8720288218241439
    
    > chardetect Joker.BDRip.x264-AAA.cyr_utf8.srt
    Joker.BDRip.x264-AAA.cyr_utf8.srt: utf-8 with confidence 0.99
    

    安装:

    pip install chardet
    

    我用这个Serbian subtitles 来测试。

    【讨论】:

    • 我忘了说我已经在使用它了;这就是我确定标题首先使用 Windows-2152 编码的方式。
    • 你的意思是Windows-1252
    • 抱歉,是的,这里打错了。 Windows-1252。使用from chardet import detect, detect(data)['encoding']
    • 很好,我不知道我可以从命令行做到这一点,谢谢!无论哪种情况,我都已经获得了正确的编码,这似乎是该语言组文件的默认编码。
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多