【发布时间】:2016-07-28 23:18:34
【问题描述】:
我被所有这些令人困惑的编码东西所困扰。我有一个包含中文字幕的文件。我实际上相信它是 UTF-8,因为在 Notepad++ 中使用它会给我带来非常好的结果。如果我设置gb2312,中文部分还是可以的,但是我会看到一些UTF8代码没有被转换。
目标是遍历文件中的文本并计算不同字符出现的次数。
import os
import re
import io
character_dict = {}
for dirname, dirnames, filenames in os.walk('.'):
for filename in filenames:
if "srt" in filename:
import codecs
f = codecs.open(filename, 'r', 'gb2312', errors='ignore')
s = f.read()
# deleting {}
s = re.sub('{[^}]+}', '', s)
# deleting every line that does not start with a chinese char
s = re.sub(r'(?m)^[A-Z0-9a-z].*\n?', '', s)
# delete non chinese chars
s = re.sub(r'[\s\.A-Za-z0-9\?\!\\/\-\"\,\*]', '', s)
#print s
s = s.encode('gb2312')
print s
for c in s:
#print c
pass
这实际上会给我完整的中文文本。但是当我打印出底部的循环时,我只会得到问号而不是单个字符。
还要注意我说它是 UTF8,但我必须使用 gb2312 进行编码并作为我的 gnome 终端中的设置。如果我在代码中将其设置为 UTF8,无论我将终端设置为 UTF8 还是 gb2312,我都会得到垃圾。所以也许这个文件毕竟不是 UTF8 的!?
在任何情况下s都包含完整的中文文本。为什么不能循环播放?
请帮助我理解这一点。这对我来说非常困惑,文档让我无处可去。谷歌只是引导我解决有人解决的类似问题,但到目前为止还没有任何解释可以帮助我理解这一点。
【问题讨论】:
-
那么是gb2312还是UTF-8?如果是 UTF-8,为什么不将编码设置为
open()而不是gb2312?。就目前而言,这个问题没有多大意义 -
它不是 UTF-8,它是GB2313。 UTF-8 和 GB2313 都是 encodings,一种将字符编码为字节的方法。您是否将 UTF-8 与 Unicode 标准混淆了?
-
是的,@MartijnPieters - 我知道区别,我也知道它们是针对不同字符集的编码。 OP 似乎可以互换使用这两种编码/字符集>“我实际上相信它是 UTF-8,因为在 Notepad++ 中使用它会给我带来非常好的结果。”
-
@JasonTS,你不应该改变你的终端的编码而不改变你的
locale。 Python 将使用您的语言环境来计算调用print时要使用的编码。 -
@AlastairMcCormack:我的评论不是针对你的。 :-)
标签: python unicode utf-8 chinese-locale