目前百度MIP对网页编码规定,必须要是UTF-8编码,那么GBK或者GB2312的网页要怎么办呢?是否可以将GBK或者GB2312编码转换成UTF-8编码呢?答案是可以的。
那么为什么百度MIP只支持UTF-8编码呢?因为现在手机上带的浏览器只支持网页的UTF-8编码,GBK或者GB2312的网页在手机上打开显示的是乱码,所以百度MIP官方为了手机网页的兼容性,规定MIP网页的编码必须是UTF-8编码,建议大家以后设计网页编码也尽量选择UTF-8编码,UTF-8编码不仅是国际主流编码,而且也会导致网页所占空间也会减小,以下教程也适用于其它的PHP程序cms系统。
GBK/GB2312编码转换为UTF-8编码大概的步骤方法是先将网站程序替换成UTF-8编码,再将网站模版进行转码,最后再进行数据库的编码转换,具体步骤方法讲解如下:
在网站编码进行转码前,先将GBK(GB2312)原网站程序进行备份,步骤方法如下:
(1)利用织梦cms程序后台数据库备份功能备份好网站数据库,步骤方法为点击系统—系统设置—数据库备份/还原,点击下方的“提交”按钮,进行原程序数据库的备份,备份时间长短根据数据库大小来决定。
(2)网站数据库备份完成以后,再将网站根目录下的所有文件进行打包下载到自己本地电脑中,防止转码失败,导致网站不能正常运行,完整的织梦网站分为三个部分,一个为织梦cms官方程序,一个为网站前台模板程序,最后一个就是网站数据库文件,需要依次对这三个部分进行转码操作,网站数据库文件转码可以利用帝国数据备份王进行转码,再将织梦UTF-8的程序替换原有的GBK或者GB2312程序,最后用网页编辑器对网站前台模板进行转码。
网站数据库转码,经过多次的测试,发现用帝国数据备份王进行转码是最为安全的,大家可以百度搜索下载“帝国数据备份王”,下载后将得到如下文件,如下图所示:
帝国数据备份王“upload”这个文件夹名称可以改成其它的文件夹名称,例如我们可以将“upload”改成“beifen”,放在网站根目录下面,访问帝国数据备份王,在地址栏中输入“域名/shuju”,帐号为admin,密码为123456,登录成功后出现一个数据库设置界面,将原网站的数据库地址、用户、密码都输入进去,也有可能会提示你要修改登录密码和随机验证码,按照提示修改一下就行了,接着点击下方的“备份数据”,你将会看到原网站程序的数据库名称,点击“备份数据”出现的界面很关键,因为这一步将会进行网站数据库转码操作。
我们手动选择“utf-8”编码,将网站数据库备份出来,这时候备份出来的数据库编码就是UTF-8编码了,转码完成的数据库存放目录要记住,因为将网站数据备份完成以后,我们还需要进行还原操作的,在数据库还在之前,我们需要先将网站程序和网站模板进行转码,网站程序和网站模板转码完成以后,再还原转码后的网站数据库。
网站程序转码大概步骤是,先保留好原有的GBK或者GB2312程序备份包,再将原有程序空间的程序清除干净,网站根目录下的“帝国数据备份王”千万记得不要清理了,到时候恢复网站数据库还要用到,将在织梦官网下载好的织梦UTF-8编码程序解压上传到网站空间内。
安装步骤详解请看《织梦cms系统MIP改造教程方法步骤》这篇文章,下面我们直接讲解织梦cms模版转码操作。
第1步,在本地电脑浏览器地址栏中输入,你的域名/install/index.php,开始安装织梦程序
第2步,勾选“我已经阅读并同意此协议”,点击继续,进行程序的下一步安装。
第3步,如果上图中“继续”按钮是可点状态,直接点“继续”进行程序的下一步安装,出现的红叉就不用管了,如果“继续”按钮是不可点击状态,说明你的多站空间有问题,找空间服务商查找相关原因或者自行查找原因。
这个步骤是最重要的一个步骤,上图中“模版选择”我们不需要进行任何操作,“数据库设定”按照空间商给的信息依次输入“数据库主机”、“数据库名称”、“数据库用户”、“数据库密码”、“数据表前缀”、“数据库编码”,“数据表前缀”可改可不改,“数据库编码”默认的也不需要修改。
“管理员帐号密码”这块设置你网站后台管理的帐号和密码,自己记着就行,Cookie加密码一定不要动。
“网站设置”这块,网站名称填入你网站的品牌名称即可,其它的地方就不需要动了,”安装初始化数据进行体验“这个复选框不要勾选,最后点击”继续“按钮完成程序的安装,下图中附上织梦cms程序安装的参数设置,大家可以参考一下。
如果出来以下图示的界面,则证明你的织梦和序安装成功了
织梦cms程序转码部分这里就完成了。
这个步骤一定要使用专业网页编辑软件进行转码,例如dreamweaver或者Notepad+,也可以使用网站针对GBK(gb2312)转码utf-8的小工具软件,千成记得不要用记事本进行转码操作。
首先将原GBK(gb2312)网站前台模板下载下来,一般是在templets文件夹下的default文件夹中,下面以dreamweaver网页编辑软件教大家如何将GBK(gb2312)模板转成utf-8。
用dreamweaver网页编辑软件打开一个前端模版文件,依次点击软件菜单中的修改—页面属性—标题/编码—编码,如下图所示:
我们将原模版文件简体中文(GB2312)选择成 Unicode(UTF-8),
点击确定,这个模板文件就成功的转成UTF-8编码了,重复以上方法将其它前台模板文件全部转成UTF-8编码。
6、恢复网站
网站前台模板文件转码完成以后,网站转码其实还并未完全完成,还有数据库并未恢复过来,这里我们将再次使用”帝国数据备份王“来恢复网站的数据库,步骤方法为:点击“备份与恢复数据库”下面的恢复数据,再选择数据源目录,就是刚刚备份的数据库目录,选择下面的“要导入的数据库”再选择数据表(就是原网站数据表),点击开始恢复。
恢复网站数据库后,GBK(gb2312)编码的网站就完成被转成utf-8编码了,到了这一步我们就可以对网站模板进行MIP改造了。
7、转码注意事项
1)如果原GBK(gb2312)编码的程序做过二次开发或其它的程序改动,不建议进行转码操作;
2)程序转码完成以后,我们需要在后台进行一步确认操作,方法步骤为系统设置-系统基本参数,最后点击一下确定就行了;
3)如果更新网站,有出现错误,在后台点击生成-自动任务-更新系统缓存,试试没有解决你的问题;
4)织梦模版标签尽量使用兼容的模版标签。
织梦的转码操作教程也可以应用到其它的PHP程序cms系统,大家如果还有其它总理 ,欢迎下方留言评论,会及时回复大家。
以discuz后台提供的数据库导出方法为例先分享一下我转码的过程,后面也会讲另外几种数据库导入导出的方法。
首先关闭站点
站长,数据库,备份,强制UTF8
备份完成的数据库文件在根目录/data/backup_XXX里,带时间标记
接下来,把插件、模版、论坛附件、数据库备份文件、会员头像文件、以及你自己修改过的文件比如ICO等下载到本地。(只要是你自己修改过的,和discuz默认不一样的地方都下载下来)备用!
做好这些准备工作之后,原站先不要动,在本地搭建测试环境或者开个测试主机,全新安装UTF8论坛程序,这里需要注意的是,最好是和GBK的程序是同一个版本的,意思就是2.5对2.5,3.0对3.0,3.2对3.2,3.3对3.3,不同版本没有测试过,有兴趣的可以测试下。
安装好之后,把我们刚才下载下来的那些文件,上传到新论坛的对应目录中,有需要转码的文件提前转好码,一般情况下,模版需要自行转码,一般情况下,插件都是都是支持4种编码的
如果不支持,就需要自行转码。上传好之后,后台恢复数据。
恢复完之后,会发现是乱码的,后台把模版、插件全部卸载,然后重新安装,再更新缓存,就OK了。不过这种恢复数据的方法并不完美,不知道是不是可以重现,后台插件设置里面调用的版块,是新安装论坛的,并不显示老论坛的版块,但是在前台的实际展示中,老论坛设置的版块都生效了。
如果数据库无法链接的话,请把下面俩文件里的数据库配置及域名配置修改好
有点轻微强迫症的我,不满足于这种有瑕疵的方法,于是我又尝试了另外几种数据库的导入导出方法,我简单总结一下
1.discuz自带的数据库导入导出功能,就是上面讲的,瑕疵也提到了。
2.帝国备份王,这个不详细说了,我看社区有写过教程的了,自行翻阅,前面关于文件的操作都一样,不同的地方在于,全新安装UTF8论坛之后,用帝国备份王删除新论坛的数据库文件,然后导入从老论坛导出的数据库文件(当然,老数据也是用帝国备份王导出来的,这好像是一句废话)
需要提的一点是,我尝试了好几次,有几次成功,有几次不成功。但是成功的几次,数据转换都非常完美!
3.用服务器商提供的数据导入导出功能实现数据库的转换,现在的主机基本上都提供这个功能的,操作流程同帝国备份王,也是先删除新论坛的数据库文件,然后导入,多次尝试,有成功的,也有不成功的,成功的一次,也是非常完美。
重点提示:上文中我提到的完美,是不包含DIY数据的,是指的基本功能,转换完之后,我是手动修复的部分DIY数据!
另外说一下,最后我是开了个测试主机进行的转换,转换过程中原站一直没动,全部转换好,设置好之后,先把原域名解析到了测试主机,然后对主站进行完全备份,下载到本地,(为何要备份下载到本地呢?因为时间太短来不及完全测试,日后发现哪里少了文件可以再从本地传上去)最后全部删除,又把测试站数据迁移到原站,弄好之后,又把域名解析回原站,这样可以最大限度的减少对访问会员的影响。当然,如果只担心收录影响的话,可以用站长平台提供的闭站保护!
一点小的过程分享,希望带给想转码的同学一点点的帮助,祝转码成功,最后祝社区的朋友和管理员、版主及家人 新春喜乐,幸福安康,财源广进,步步高升!
几天在处理服务器的一个问题时,发现这样一段代码,功能是把一个uft-8格式的xml文件转成gbk的编码格式。
先说下环境,Centos7系统+C语言。原来的写法是用调用system()函数,来执行一个类似于shell窗口的命令:
system("iconv -c -f UTF8 -t GBK /usr/local/configs/123.xml -o /usr/local/configs/123.xml.gbk");
这句话,是利用了Centos系统中安装的iconv的库,来把utf-8的格式文件,转成gbk格式的文件。通过程序调用system()函数,本身没问题。但是发现在系统内存不足时,system的返回值是12,查了下代表系统内存不足,从而执行失败。system函数在被程序调用时,会fork一个子进程,会复制父进程中一些数据段,代码段等等(再深的研究,我也不懂)。所以,就会出现系统内存剩的不多时,在调用system函数,就可能出现内存不足,导致调用失败。
解决方法,一个是升级内存,一个是优化整体代码的内存使用情况。还剩一个就是不用system()函数来执行icovn的命令。这里用C语言实现了一个utf-8转码gbk的程序,供参考。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#define IN_BUFFER_SIZE (1024*100)
#define OUT_BUFFER_SIZE (IN_BUFFER_SIZE * 4) // 假设GBK可能需要更多空间
int main(void) {
FILE *input_file, *output_file;
char in_buffer[IN_BUFFER_SIZE];
char out_buffer[OUT_BUFFER_SIZE];
size_t in_bytes_left, out_bytes_left;
iconv_t cd;
char *input_ptr, *output_ptr;
// 打开输入和输出文件
input_file = fopen("/usr/local/configs/123.xml", "rb");
if (!input_file) {
perror("Error opening input file");
return 1;
}
output_file = fopen("/usr/local/configs/123.xml.gbk", "wb");
if (!output_file) {
perror("Error opening output file");
fclose(input_file);
return 1;
}
// 初始化iconv描述符
cd = iconv_open("GBK", "UTF-8");
if (cd == (iconv_t)-1) {
perror("iconv_open");
fclose(input_file);
fclose(output_file);
return 1;
}
// 读取并转换数据
while ((in_bytes_left = fread(in_buffer, 1, IN_BUFFER_SIZE, input_file)) > 0) {
input_ptr = in_buffer;
out_bytes_left = OUT_BUFFER_SIZE;
output_ptr = out_buffer;
if (iconv(cd, &input_ptr, &in_bytes_left, &output_ptr, &out_bytes_left) == (size_t)-1) {
if (errno == E2BIG) {
// 输出缓冲区太小,应该增加其大小
// 但在这个例子中,我们假设缓冲区足够大,因此这是一个错误情况
perror("iconv: E2BIG");
break;
} else if (errno == EILSEQ) {
// 输入序列无效,可以跳过或替换字符
// 在这里我们只是跳过它
input_ptr++;
in_bytes_left--;
} else {
perror("iconv");
break;
}
}
// 写入转换后的数据到输出文件
fwrite(out_buffer, 1, output_ptr - out_buffer, output_file);
}
// 清理并关闭文件
iconv_close(cd);
fclose(input_file);
fclose(output_file);
return 0;
}
编译:gcc直接编译即可
直接使用函数处理utf-8转gbk的方法,这里面还是用了iconv的库函数。
*请认真填写需求信息,我们会在24小时内与您取得联系。