GBK编码与转换

发布时间:2023-05-23

一、什么是GBK编码

GBK即“汉字内码扩展规范”,是简体中文和繁体中文的编码集。它是 GB2312 编码的扩展,GB2312 编码集只包含简体中文字符,而 GBK 编码集则包含简体中文和繁体中文字符,是兼容 GB2312 编码的。 GBK 编码是一种双字节编码方式,每个汉字占两个字节,可以表示 21886 个汉字及其它符号。其中包含了汉字的基本部分和拓展部分。

二、GBK编码与Unicode

Unicode 是一种字符编码体系,它为每个字符分配了一个唯一的编号——码点。Unicode 码点的取值范围为 0x000000~0x10FFFF。Unicode 随后被诸如 UTF-8、UTF-16、UTF-32 等各种实现所支持。 GBK 编码与 Unicode 的关系在于,GBK 编码是国际码点集(UCS)与 GB 2312 两者标准的结合,它与 Unicode 的码点不一致。可以通过一个中间过渡的过程,如转换为 UTF-8,实现与 Unicode 的交互。

// GBK 转 UTF-8
$str = iconv('GBK', 'UTF-8', $str);

三、GBK编码与转换

在实际开发中,常常会遇到字符编码转换的问题。因为在不同的平台或环境下,可能使用的字符集会不同,尤其是在多语言的环境下更是如此。 PHP 中提供了多种字符编码转换的方式,如 iconv 函数、mb_convert_encoding 函数等。我们以将 UTF-8 编码的字符串转换为 GBK 编码的字符串为例:

// iconv 函数
$str = '这是一个UTF-8编码字符串';
$gbkStr = iconv('UTF-8', 'GBK', $str);
// mb_convert_encoding 函数
$str = '这是一个UTF-8编码字符串';
$gbkStr = mb_convert_encoding($str, 'GBK', 'UTF-8');

四、GBK编码与乱码

在字符编码转换过程中,常常会出现乱码的问题。乱码的出现是因为字符集不一致,在一个字符集中定义的字符,在另一个字符集中就无法识别。为了解决乱码的问题,我们需要进行字符编码的转换。 出现乱码的原因有很多,比如发送端使用 GBK 编码,而接收端使用 UTF-8 编码。如果我们在发送前使用 iconv 函数将 GBK 编码转换为 UTF-8 编码,那么接收端就不会出现乱码。

// GBK 转 UTF-8
$str = '这是一个GBK编码字符串';
$utf8Str = iconv('GBK', 'UTF-8', $str);
// 发送 utf8Str

五、GBK编码与数据库

在与数据库进行交互的过程中,也需要注意字符编码的问题。比如 MySQL 数据库默认使用的是 Latin1 编码,如果需要使用 GBK 编码,则需要在 PHP 程序中进行转换。 在进行数据库连接时,可以设置SET NAMES语句将数据库的编码设置为 GBK 编码:

$db = new mysqli('localhost', 'username', 'password', 'dbname');
$db->query("SET NAMES 'GBK'");

在从数据库中读取数据后,也需要将数据转换为 GBK 编码,否则可能会出现乱码的问题:

// 读取数据,数据可能是 UTF-8 编码的
$result = $db->query("SELECT * FROM table");
$data = $result->fetch_assoc();
// 将数据转换为 GBK 编码
$data = array_map(function($str){
    return iconv('UTF-8', 'GBK', $str);
}, $data);

六、GBK编码与文件读写

在文件读写的过程中,也需要注意字符编码的问题。比如在读取一个 UTF-8 编码的文件时,如果不进行转换,就会出现乱码的问题。 在进行文件读写时,可以使用 PHP 自带的函数 mb_convert_encoding 函数进行编码转换。

// 读取 UTF-8 编码的文件
$content = file_get_contents('file.txt');
// 将文件内容转换为 GBK 编码
$content = mb_convert_encoding($content, 'GBK', 'UTF-8');
// 写入 GBK 编码的文件
file_put_contents('file.txt', $content);

七、GBK编码与HTTP请求

在进行 HTTP 请求时,也需要注意字符编码的问题。比如在使用 file_get_contents 函数进行请求时,可以在请求头中设置字符编码,以便正确地进行编码转换。

// 发送 HTTP 请求
$url = 'http://example.com';
$opts = array('http' => array(
    'method' => 'GET',
    'header' => 'Content-type: text/html; charset=GBK'."\r\n",
));
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

八、小结

GBK 编码是中文编码集,可以用于表示简体中文和繁体中文字符,它是 GB2312 编码的扩展。在实际开发中,常常会出现需要进行编码转换的情况,比如在与数据库进行交互、文件读写、HTTP 请求等过程中。