1. 问题描述
在PHP中使用gzip或者deflate压缩输出流的时候,如果内容中含有中文,则解压缩后的内容会出现乱码。
2. 解决方法
解决这个问题有两种方法:
2.1 方法一:使用Content-Encoding: utf8头信息
在输出流的头信息中添加Content-Encoding: utf8头信息,使浏览器可以正确解压缩中文内容。
PHP代码如下:
$content = "这里是包含中文的内容";
header('Content-Encoding: utf8');
echo gzencode($content, 9);
该方法可以正常解决中文乱码的问题,但是会增加响应头的大小,对于网络传输会产生额外的负担。
2.2 方法二:使用Content-Encoding: gzip头信息
使用gzip压缩输出流,并且在浏览器端使用JavaScript解压缩,这样可以减少响应头大小,降低网络传输负担。
2.2.1 后端代码
使用PHP的gzip压缩函数gzencode()压缩输出流,并且添加Content-Encoding: gzip头信息,将压缩后的内容输出。
PHP代码如下:
$content = "这里是包含中文的内容";
header('Content-Encoding: gzip');
echo gzencode($content, 9);
2.2.2 前端代码
使用JavaScript代码解压缩gzip压缩的输出流。
JavaScript代码如下:
function gunzip(data) {
var gunzip = new Zlib.Gunzip(new Uint8Array(data));
var plain = gunzip.decompress();
return plain;
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = gunzip(xhr.response);
document.getElementById('content').innerHTML = data;
} else {
alert('Error: ' + xhr.status);
}
}
};
xhr.open('GET', 'test.php', true);
xhr.responseType = 'arraybuffer';
xhr.send();
该方法使用了Zlib.js库进行解压缩,可以在前端对gzip压缩的输出流进行解压缩。
以上就是解决PHP压缩中文乱码问题的两种方法。