背景
运行某c++程序,出现乱码,源文件是gb2312编码。
以下是几种解决问题的方法。
中间研发的不靠谱方法
应用了管道机制
1 2 3 4 5 6 7 8
| import sys import os reload(sys) sys.setdefaultencoding("utf-8") text = os.popen('./demo').read() print text.decode('gbk')
|
修改shell的编码
只要修改 环境变量LANG 就好了
注意这里LANG与=之间不能有空格,否则会被误判
使用iconv命令修改源文件的编码
将源文件的编码改为utf-8
1
| iconv -f gb2312 -t utf-8 aaa.txt > bbb.txt
|
关于iconv的详细可以看
配合python脚本应该可以实现批量转化,当然直接用shell脚本写也可以,不过我不太了解shell的语法。
批量转化脚本
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
| #!/usr/bin/python import os,sys def convert( filename, in_enc = "GBK", out_enc="UTF-8" ): # read the file content = open( filename ).read() # convert the concent try: new_content = content.decode( in_enc ).encode( out_enc ) #write to file open( filename, 'w' ).write( new_content ) except: print " error... "+filename def explore( dir ): for root, dirs, files in os.walk( dir ): for file in files: path = os.path.join( root, file ) print "convert " + path, convert( path ) print " done" def main(): if len( sys.argv ) > 1 : path = sys.argv[1] if os.path.isfile( path ): convert( path ) elif os.path.isdir( path ): explore( path ) if __name__ == "__main__": main()
|
参考资料
[1] iconv用法
[2] shell编码转换