网站 把 GB2312 转成 UTF-8 全攻略


我06年开始折腾网站, 第一个网站 steakovercooked.com 完全是自己设计的 (HTML,CSS,JS 甚至有缓存的机制). 当年对文件的编码并不是很了解, 也没有特别在意. 导致了全站的文件全是 ANSI 编码 中文汉字在 ANSI 编码下就是两个字节. UTF-8近几年很流行,特别是在互联网上. 因为UTF-8对世界各国语言兼容做得特别好, WordPress 博客就是用了UTF-8编码.

UTF-8-ascii-iso-8859-1 网站 把 GB2312 转成 UTF-8 全攻略 互联网 技术 折腾 网站信息与统计

UTF-8-ascii-iso-8859-1

老外的电脑要是没有装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 格式:

notepad-convert-to-utf-8 网站 把 GB2312 转成 UTF-8 全攻略 互联网 技术 折腾 网站信息与统计

notepad-convert-to-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.

phpmyadmin 网站 把 GB2312 转成 UTF-8 全攻略 互联网 技术 折腾 网站信息与统计

phpmyadmin

有了这个改过的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可以显示世界上所有的文字.

英文同步: https://helloacm.com/how-to-convert-gb2312-or-other-non-ansi-characters-to-utf-8-encoding-both-mysql-and-files-charset/

GD Star Rating
loading...
本文一共 714 个汉字, 你数一下对不对.
网站 把 GB2312 转成 UTF-8 全攻略. (AMP 移动加速版本)
上一篇: 怎样在 WordPress 里 创建 所有 推特 ?
下一篇: 轻度强迫症

扫描二维码,分享本文到微信朋友圈
947b0fe20ca0da5afd6a7c4ed2fbe7da 网站 把 GB2312 转成 UTF-8 全攻略 互联网 技术 折腾 网站信息与统计

一条回应

评论