关于windows下网站迁移到Linux下编码问题
Posted on 6 年前 , Last updated on 5 年前 by 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_substr
或 mb_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.soliphp.com/post/linux/migration-to-linux-under-the-coding-problem-on-the-windows-website