iconv与shell乱码解决方法

背景

运行某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与=之间不能有空格,否则会被误判

1
export LANG=zh_CN.UTF-8

使用iconv命令修改源文件的编码

将源文件的编码改为utf-8

1
iconv -f gb2312 -t utf-8 aaa.txt > bbb.txt

关于iconv的详细可以看

1
iconv --help

配合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编码转换