我06年开始折腾网站, 第一个网站 steakovercooked.com 完全是自己设计的 (HTML,CSS,JS 甚至有缓存的机制). 当年对文件的编码并不是很了解, 也没有特别在意. 导致了全站的文件全是 ANSI 编码 中文汉字在 ANSI 编码下就是两个字节. UTF-8近几年很流行,特别是在互联网上. 因为UTF-8对世界各国语言兼容做得特别好, WordPress 博客就是用了UTF-8编码.
老外的电脑要是没有装GB2312编码, 那么在浏览器里, 显示GB2312的页面就会显示乱码. ANSI里的汉字如果要被浏览器支持, 就应该会在网页的 head 标记内有以下声明:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
在 HTML5 里, 可以更为简洁:
<meta charset="gb2312">
把文件从 (ANSI) 转换成 UTF-8
让浏览器知道你的文件编码已经是 UTF-8 了, 需要在 HTML/PHP 的 head 标记里声明 (右键查看源代码看看):
<meta charset="utf-8">
首先, 你得先把整个文件转成 UTF-8, 最简单的方法就是在记事本里另存为 UTF-8 格式:
当然, 像我的网站有几百个PHP源文件+HTML/CSS/JS, 这样一个一个改不是办法. 登陆 VPS 主机服务器, 然后借助 iconv 工具来转换. 以下脚本会把一个文件给从GB2312转成UTF-8.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash # https://helloacm.com if [ "$#" -ne 1 ] || ! [ -r "$1" ]; then echo "用法: $0 file1" exit 1 fi x=`file -bi $1 | grep 'utf' | wc -l` if [ $x -eq 1 ]; then echo "$1 已经转换" else echo converting $1 to UTF8 iconv -f "gb2312" -t "UTF-8" $1 -o $1 fi |
#!/bin/bash # https://helloacm.com if [ "$#" -ne 1 ] || ! [ -r "$1" ]; then echo "用法: $0 file1" exit 1 fi x=`file -bi $1 | grep 'utf' | wc -l` if [ $x -eq 1 ]; then echo "$1 已经转换" else echo converting $1 to UTF8 iconv -f "gb2312" -t "UTF-8" $1 -o $1 fi
有时候转两次会有问题(个别文件), 所以我们通过命令 The `file -bi $1 | grep ‘utf’ | wc -l` 检查当前文件是什么格式. 之后命令 iconv -f “gb2312” -t “UTF-8” $1 -o $1 则进行转换.
然后借助 find 命令, 以下会将所有目录下(包括子目录)的 php 代码进行 UTF-8 转换 (批量化).
for x in `find . -type f -name "*.php"`; do toUTF $x done
MYSQL 数据库转换成 UTF-8 编码
之前老版本的 MySQL 所默认的编码是 latin1_swedish_ci, 在这种编码方式下, 中文就会变成2个字节 (ANSI/GB2312), 在 页面编码如果是 UTF-8 的显示下面则会是乱码 e.g. phpMyAdmin.
可以通过先导出数据库为 ISO8859-1 编码方式 (ANSI) 然后就可以像上面编辑文件一样的方法转换成 UTF-8, 当然, 你还需要把SQL语句中的 latin1 替换成 utf-8.
有了这个改过的SQL文件, 就可以在 PhpMyAdmin 里导入了, 你会发现所有字符串字段 text, varchar, longtext 都会变成 utf8_general_ci 编码.
MySQL UTF-8 设置
在PHP里, 可以通过下面来设置 编码方式:
1 2 | mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8"); |
mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8");
mysql_set_charset 函数类似功能:
1 2 3 4 5 6 7 8 | if (!function_exists('mysql_set_charset')) { function mysql_set_charset($charset, $dbh) { return mysql_query("set names $charset", $dbh); } } // mysql_set_charset — Sets the client character set mysql_set_charset("utf-8", $link); //(PHP 5 >= 5.2.3) |
if (!function_exists('mysql_set_charset')) { function mysql_set_charset($charset, $dbh) { return mysql_query("set names $charset", $dbh); } } // mysql_set_charset — Sets the client character set mysql_set_charset("utf-8", $link); //(PHP 5 >= 5.2.3)
可以通过 MySQL 配置文件 /etc/mysql/my.cnf 将以下加入 保存并重启: sudo service mysql restart.
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8
为什么选择 UTF-8?
UTF-8 对于汉字来说, 用的是三个字节, 对于英文还是1个字节, 所以相对以前的编码方式得到了很好的兼容. 如果是中文多一些(面向中文读者), 可以用 GB2132 编码方式来节省空间.
当然, UTF-8 对于国际化来说做得比较好, 你不用担心哪种语言显示处理不了. 一旦转成 UTF-8, 以后都不用担心编码和语言的问题, 因为UTF-8可以显示世界上所有的文字.
loading...
上一篇: 怎样在 WordPress 里 创建 所有 推特 ?
下一篇: 轻度强迫症
世上本无事啊,你这编码还搞得这么复杂,好在你能处理掉它.