文章目录
  1. 1. 转换文件的编码格式
  2. 2. 批量删除注释
  3. 3. 关键字的全局替换

在日常的工作生活中,程序员为了高效的开发一般都会自己写一些简单工具。
最为常见的个人工具就是在自己的IDE中加入一些宏来提高编码效率和编码的准确性。
还有一些团队中使用的工具,可能有良好的GUI界面,跨平台的支持等等。

最近由于项目的需求在网上搜刮了一些python脚本后自己又做了一些改动。

转换文件的编码格式

对于文件编码格式的转换思路就是按照当前编码格式读取文件,然后转换成统一的编码格式。
但是其中却有一个坑,在将utf16格式却出现了问题。
最后在stack overflow上找到了原因,原来是和ascii之间的问题,要做一些特殊的处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#Change one file
def change_file_charset(path_filename,chardet):
f = file(path_filename)
print path_filename
data = f.read()
f.close()

if data!="":
old_charset = get_charset(data)
if chardet!=old_charset:
file_content=""
with io.open(path_filename,"r",encoding=old_charset) as f:
for line in f:
line = line.encode("ascii","ignore")
file_content += line
f = file(path_filename, 'w')
file_content=file_content.encode(chardet)
f.write(file_content)
f.close()

这里有一点点小问题,就是转码之后会将utf16中的中文全干掉。
还有就是需要引入chardet库

批量删除注释

在删除注释之前一定要统一所有文件的编码格式,各种编码方式的源码用脚想都知道会出问题。这里需要删除C#中的注释,也通用于JAVA,C/C++等使用/ /,//方式作为注释的语言。
可能第一个想到都会是正则表达式,但是后来我还是使用了一个小型的状态机作为词法分析器的方法来实现功能。思路来源于网络,好多人的博客上都有,我也不知道那个是原作者,只能感谢原作者能分享,不过我找到的版本中有一些不足,比如删除//整行注释的时候没有再加入换行符导致类似于#if #end if等关键字没有出现在一行的开头。。。还有一些其他小问题我都做了河里的修正。

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
61
62
63
64
65
# 状态  
S_INIT = 0;
S_SLASH = 1;
S_BLOCK_COMMENT = 2;
S_BLOCK_COMMENT_DOT = 3;
S_LINE_COMMENT = 4;
S_STR = 5;
S_STR_ESCAPE = 6;

def delete_one_file(file_path):
print file_path
f = file(file_path)
state = S_INIT;
filecontext = ""
while True:
line = f.readline()
if len(line) == 0:
break

for c in line:
if state == S_INIT:
if c == '/':
state = S_SLASH;
elif c == '"':
state = S_STR;
filecontext += c;
else:
filecontext += c;
elif state == S_SLASH:
if c == '*':
state = S_BLOCK_COMMENT;
elif c == '/':
state = S_LINE_COMMENT;
else:
filecontext += '/';
filecontext += c;
state = S_INIT;
elif state == S_BLOCK_COMMENT:
if c == '*':
state = S_BLOCK_COMMENT_DOT;
elif state == S_BLOCK_COMMENT_DOT:
if c == '/':
state = S_INIT;
elif c == '*':
state = S_BLOCK_COMMENT_DOT;
else:
state = S_BLOCK_COMMENT;
elif state == S_LINE_COMMENT:
if c == '\n' or c == '\n\r':
state = S_INIT;
filecontext += c;
elif state == S_STR:
if c == '\\':
state = S_STR_ESCAPE;
elif c == '"':
state = S_INIT;
filecontext += c;
elif state == S_STR_ESCAPE:
state = S_STR;
filecontext += c;
f.close()

f = file(file_path,'w')
f.write(filecontext)
f.close()

关键字的全局替换

在Unity中做混淆是比较头疼的事情,有些很多函数名称不能变,例如Awake等
还有一些脚本绑定在prefab上面,不能轻易改变其类名。
对此我在网上找到了有人使用自己定义要混淆的关键字,然后对目录下的所有文件包含此关键字进行替换。但是方法还是待完善。具体代码暂时不贴出

以上所有完整代码都在这里
https://github.com/JackLN/U3DTools/tree/master/confuse-tools

文章目录
  1. 1. 转换文件的编码格式
  2. 2. 批量删除注释
  3. 3. 关键字的全局替换