目前百度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小時內與您取得聯系。