更新于 2013-05-26 01:25:06 UEANER

前几天公司要把在windows上的那部分网站迁移到linux上,但迁移过程中遇到乱码问题,在windows下的网站统一采用gb2312编码,所以需要进行转码工作,从以下几个方面入手:

1. MySQL数据库编码集
2. html, css, xml 中 charset 编码设置
3. php 截取中文函数
4. php, html, js 等文本源码编码字符集

MySQL数据库字符集

使用 vim 编辑 database.sql 将 DEFAULT CHARSET=gb2312 改为 DEFAULT CHARSET=utf8

:%s/gb2312/utf8/g

另可能程序中存在 set names "gb2312" 的代码,但应该不会太多,请注意。

html, css, xml 中 charset 编码设置

打开终端使用 sed + grep 批量更改多文件匹配字符串,进入要更改的网站目录,输入:

sed -i "s/gb2312/utf-8/g" `grep gb2312 -rl .`

php 截取中文函数

使用 php 自带的 mb_substrmb_strcut 函数截取,如截取前20个中文字符:

mb_substr($str, 0, 20, 'utf-8');
// 或
mb_strcut($str, 0, 60, 'utf-8');

php, html, js 等文本源码编码字符集

使用 shell 脚本批量处理,循环目录下文件(子目录),如果是文件且编码集为 iso-8859-1, 则使用 iconv 转码为 utf-8

#!/bin/bash
# toUTF8.sh

for f in `find $1`
do
    if [ -f $f ]; then
        CHARSET="$( file -bi "$f"|awk -F "=" '{print $2}')"
        #if [ "$CHARSET" != "utf-8" ]; then
            #iconv -f "$CHARSET" -t utf8 "$f" -o "$f"
        #fi
        if [ "$CHARSET" == "iso-8859-1" ]; then
           iconv -f gbk -t utf-8 "$f" -o "$f"
           echo -e "\nConverting $f"
        fi
    else
       echo -e "\nSkipping $f - it's a regular file"
    fi
done

注:这里其实有一个问题 iconv 对于大于1000行的文件进行转码时,会截断文件,可以将 wc -l $f 大于 1000行的文件输出来,进行手工转码。如果你有更好的转码方式请回复,谢过了。

参考

stackoverflow:http://stackoverflow.com/questions/9824902/iconv-any-encoding-to-utf-8#answer-13258111

到此转码完成,希望可以给同样需求朋友一个参考。

转载请注明出处。
本文地址:http://blog.aboutc.net/shell/14/migration-to-linux-under-the-coding-problem-on-the-windows-website

评论:0

关闭高亮高亮 分享到新浪微博分享到新浪微博