为什么转换编码,起因:分析应用程序日志,文件编码格式gb2312(含中文字符),

通过linux shell脚本从日志中提取出需要的字段并生成有固定符号隔离的文本文件导入到mysql数据库,
mysql建立的库字符集是utf8(特殊原因没有改成gb2312),由于原始的日志文件是gb2312格式,
通过shell生成的最终文件编码格式也是gb2312编码,所以才需要用到编码转换,
mysql库字符集编码必须与导入的文本文件编码格式一致,才能顺利导入。

脚本
# vi x
#!/bin/sh
ts=`(date +%Y%m%d)`
#targetdir=/root/siji/
#cd $targetdir
cat alertlog | grep $ts | grep -a '级' > c34log
# 逐一取需要的字段,并用;号隔开
cat c34log | awk '{print $1}' | sed 's/.*$/&\;/g'>s1
cat c34log | awk '{print $2}' | sed 's/.*$/&\;/g'>s2
cat c34log | awk '{print $3}' | sed 's/.*$/&\;/g'>s3
cat c34log | awk '{print $4}' | sed 's/.*$/&\;/g'>s4
cat c34log | awk '{print $5}' | sed 's/.*$/&\;/g'>s5
cat c34log | awk -F'(' '{print $2}' | awk -F')' '{print $1}' | sed 's/%//g' | sed 's/.*$/&\;/g' >s6
# 合成各个字段,生成最终文本文件
paste s1 s2 s3 s4 s5 s6 > all
# 把含中文的文本文件转换成的utf8编码格式
enca -L zh_cn -x utf8 all
# 导入数据库
/usr/local/mysql/bin/mysql -h 127.0.0.1 -u root -pYOUR_PASSWORD <sql

sql文件内容(sql语句)
# vi sql
# 使用alertlog数据库
use alertlog;
# 导入生成的all文本文件,其中用;隔离各个字段,回车隔离每行
load data local infile 'all' into table c3log fields terminated by ';' lines terminated by '\n';

# chmod 711 x


一:字符编码的转换工具

1.多平台方法:
iconv        提供标准的程序和API来进行编码转换;
convert_encoding.py    基于Python的文本文件转换工具;
decodeh.py    提供算法和模块来谈测字符的编码;

2.Linux:
recode    转换文件编码;
Utrac    转换文件编码;
cstocs    转换文件编码;
convmv    转换文件名编码;
enca    分析给定文件的编码;

3.Windows:
cscvt    字符集转换工具;

二:linux下查看文件编码

1. 在vi中查看文件编码
:set fileencoding

2. 用enca强大的查看编码工具

# 查看文件编码
# enca -L 现在文件的语言 -d 需查看编码的文件名
如 enca -L zh_cn -d test_zh_cn.file

------------
# enca -l language 查看支持的语言

三. linux转换文件编码

1.enca转化编码(强烈推荐enca工具)
# enca -L 现在文件的语言 -x 需要转换编码 需要转换编码的文件
如 enca -L zh_cn -x utf8 test_zh_cn.file

2. iconv转换,这个工具不好使!经常转化不成功
iconv -f 文件原来编码 -t 需要转换的编码 需要转换的编码的文件 -o 转换编码后的文件
或者
iconv -f 文件原来编码 -t 需要转换的编码 需要转换的编码的文件 > 转换编码后的文件