请脚本高手帮忙写一个脚本

2015-12-23 09:58:21 +08:00
 patrickstar
需要把 linux 下的 UTF-8 编码的源程序交给别人在 Windows 上的 VS 2010 和 VS 2013 下使用,就需要把源程序(*.cpp, *.hpp, *.h)由 UTF-8 编码转换为 UTF-8 with BOM 编码,即把'\xEF\xBB\xBF'三个字节插入到一个目录(含子目录)下的所有*.cpp, *.hpp, *.h 文件头上然后放到一个新目录下,如果能发现已经是 UTF-8 with BOM 就不插入那就更好了,对于 sed 实在不熟悉

先谢谢!
4145 次点击
所在节点    Linux
26 条回复
infinity1207
2015-12-23 13:28:42 +08:00
用 python 写了一个,你根据需要把需要 top 变量改为你需要转换编码源文件所在目录即可。

```
# -*- coding: utf-8 -*-

import os
import binascii
import re

def handle(file_path):
f = open(file_path, 'r')
content = f.read()
f.close()
bom = binascii.b2a_hex(content[:3])
if bom == 'efbbbf':
print "%s \t have utf8 bom already." % file_path
return;

f = open(file_path, 'w')
bom = binascii.a2b_hex('efbbbf')
content = bom + content
f.write(content)
f.close()
print "%s \t was added utf8 bom done." % file_path

if __name__=='__main__':
top = r'd:\\data'
for root, dirs, files in os.walk(top):
for f in files:
m = re.search(r'(\.h)|(\.cpp)|(\.hpp)', f)
if m:
file_path = os.path.join(root, f)
handle(file_path)
```
infinity1207
2015-12-23 13:35:47 +08:00
回复怎么不支持 markdown ?具体缩进看图片吧~
Mutoo
2015-12-23 13:38:40 +08:00
你需要的是 unix2dos
Usage: unix2dos [options] [file ...] [-n infile outfile ...]
-m, --add-bom add Byte Order Mark (default UTF-8)
vus520
2015-12-23 13:39:50 +08:00
@Mutoo 同意,一条命令搞定
Mithrandir
2015-12-23 13:47:54 +08:00
所以微软就是喜欢干这种违反标准的事情
patrickstar
2015-12-23 19:07:51 +08:00
谢谢大家了,我一个一个来尝试,选一个最快捷灵活的法子

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/245519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX