起因

前段时间在TG上认识了同校的学弟,由于兴趣相投,都喜欢玩steam游戏,所以聊得挺开心的。学弟说他喜欢看动漫喜欢看繁体字幕可是有时候只能找到简体的,github上有个openCC的开源项目可以解决,但是他不会编程,问我能不能搞一个程序解决,既然有现成项目,应该写个小脚本就行。我打算用python来写。

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python
# -*- coding: utf-8 -*-

## @booker_duan
## This programe translate Simplified Chinese to Tranditional Chinese
## Copy this script to ASS files directoy and run

import glob
import os
import opencc
import sys

# Set python encoding
reload(sys)
sys.setdefaultencoding('utf-8')

# Find ASS files from run-dir and sub run-dir
match=glob.glob(r'*.ass')
match_sub=glob.glob(r'*/*.ass')
match[-1:-1]=match_sub
match.sort()

if match:
# Print file message
print "Find matched ASS file, TOTAL:\t"+str(len(match))
match_count=0
for fname in match:
print '['+str(match_count)+']\t'+fname
match_count=match_count+1

for fname in match:
print "***Handling \t[ " + fname + " ]***"

# Read ASS file content
fread=open(fname,"r")
lines=fread.readlines()
fread.close()

# Backup origin file if no .bak file
bak_match=glob.glob(fname+".bak")
if not bak_match:
os.rename(fname, fname+".bak")

# Operate ASS file content line by line
fwrite=open(fname,"w")
for line in lines:
if line:
#line.rstrip("\r\n")
line=opencc.convert(line, config='s2t.json')
#print line
line.encode('utf-8')
fwrite.write(line)
fwrite.close()

print "***Complete \t[ " + fname + " ]***"

# No matching
else:
print "[STOP]: No matched ASS file"

代码功能很简单,就是寻找到当前目录和下一级目录里的ASS文件,对这些文件进行读取然后备份,重命名为.bak后缀的文件,读取到的内容用openCC翻译保存为与原ASS文件相同的文件名。但这里有几个坑,使得我写的比想象中久。

坑①

使用pip安装OpenCC后我以为安装好了,直接运行opencc.convert(),结果报了个segmentation fault程序就结束了,一脸懵逼以为自己代码有问题,后面发现还要安装openCC库,也就是gayhub上面star最多的那个,我用的是deepin所以直接 sudo apt-get install opencc 就好了。

坑②

编码问题,由于python默认string类型编码为ascii所以把转换后的文字保存到string就会报错,为了省事,最后统一全部都用utf-8编码,代码开头需要加上 sys.setdefaultencoding('utf-8')

参考

OpenCC 0.2 A ctypes-based OpenCC converter for Chinese
Open Chinese Convert 開放中文轉換
解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range