php ajax交互漢字亂碼的問題解決方法
來源:程序員人生 發(fā)布時間:2013-10-26 13:23:32 閱讀次數(shù):2740次
ajax只支持utf-8格式,不能支持gb2312編碼格式,所以經(jīng)常遇到gb2312的編碼的程序使用ajax就出現(xiàn)亂碼,剛找到一種解決方案是:
服務(wù)器端傳送的數(shù)據(jù)仍是gb2312編碼,客戶端用js將漢字轉(zhuǎn)變成utf8編碼顯示在頁面
方法一json
一,服務(wù)器端json數(shù)據(jù)用php的iconv函數(shù)轉(zhuǎn)換:iconv('gb2312', 'utf8', "被轉(zhuǎn)換字符串,輸出到瀏覽器");
客戶端獲取utf8數(shù)據(jù),再轉(zhuǎn)成gb2312:
- function gb2utf8(data){
- var glbencode = [];
- gb2utf8_data = data;
- execscript("gb2utf8_data = midb(gb2utf8_data, 1)", "vbscript");
- var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g|>,"%$2%$1").replace(/%([a-z].)%(.{2})/g|>,"@$1$2");
- t=t.split("@");
- var i=0,j=t.length,k;
- while(++i<j)>
- k=t.substring(0,4);
- if(!glbencode[k]) {
- gb2utf8_char = eval("0x"+k);
- execscript("gb2utf8_char = chr(gb2utf8_char)", "vbscript");
- glbencode[k]=escape(gb2utf8_char).substring(1,6);
- }
- t=glbencode[k]+t.substring(4);
- }
- gb2utf8_data = gb2utf8_char = null;
- return unescape(t.join("%"));
- }
二,header("content-type", "application/x-www-form-urlencoded; charset=gbk"); //輸出頭標(biāo),設(shè)置為gbk編碼
三,在ajax請求數(shù)據(jù)前調(diào)用上面的方法指定請求使用的字符集:xmlhttp.setrequestheader( "content-type", "application/x-www-form-urlencoded;charset=gbk");
方案二:search.php
- <?php
- header("content-type: text/html; charset=gb2312");
- include './search.htm';
- ?>
- search.htm
- <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="content-type" content="text/html; charset=gb2312" />
- <title>高級搜索</title>
- </head>
- <body>
- <h3>高級搜索</h3>
- <form method="post" action="">
- 學(xué)校類型:
- <select name="schooltype">
- <option value="">全部</option>
- <option value="1">小學(xué)</option>
- <option value="2">初中</option>
- </select>
- 學(xué)校名稱:
- <select name="sid" id="sid">
- <option value="">請選擇學(xué)校</option>
- </select>
- </form>
- <script type="text/">
- function ajax(settings) {
- var xhr = window.activexobject ? new activexobject("microsoft.xmlhttp") : new xmlhttprequest(), successed = false;
- xhr.open(settings.type, settings.url);
- if(settings.type == 'post')
- xhr.setrequestheader('content-type', 'application/x-www-form-urlencoded');
- xhr.send((!settings.cache ? 'time=' + new date().gettime() + '&' : '') + settings.data);
- settings.loader();
- settimeout(function() {
- if(!successed) {
- alert('resquest timeout!');
- xhr.abort();
- }
- }, settings.timeout);
- xhr.onreadystatechange = function() {
- if (xhr.readystate == 4 && xhr.status == 200) {
- settings.callback(xhr.responsetext.replace(/(^s*)|(s*$)/g, ""));
- }
- successed = true;
- }
- }
- function a(t) {
- ajax({
- type: 'post',
- url: 'ajax.php',
- data: 'schooltype=' + t,
- timeout: 8000,
- cache: true,
- loader: function() {},
- callback: function(d) {
- var arr = eval(d);
- if(typeof(arr) == 'object') {
- var obj, option;
- document.getelementbyid('sid').innerhtml = '';
- for(var i = 0; obj = arr; i ++) {
- option = document.createelement('option');
- option.value = obj[0];
- option.innerhtml = txt2utf8(obj[1], '&#');
- document.getelementbyid('sid').appendchild(option);
- }
- }
- }
- })
- }
- function txt2utf8(string, prefix){
- for(var i=0,utf8=[];i<string.length;utf8.push((prefix||'u')+string.charcodeat(i++)));
- return utf8.join('');
- }
- a(0);
- </script>
- </body>
- </html>
- ajax.php
- <?php
- header("content-type: text/html; charset=gb2312");
- $schooltype = !emptyempty($_post['schooltype']) ? $_post['schooltype'] : 0;
- switch($schooltype) {
- case 0:
- echo "[['40', '太平溪鎮(zhèn)花栗包完全小學(xué)'],['41', '太平溪鎮(zhèn)長嶺黑龍江希望小學(xué)'],['42', '樂天溪鎮(zhèn)初級中學(xué)'],['43', '樂天溪鎮(zhèn)蓮沱初級中學(xué)']]";
- break;
- case 1:
- echo "[['40', '太平溪鎮(zhèn)花栗包完全小學(xué)'],['41', '太平溪鎮(zhèn)長嶺黑龍江希望小學(xué)']]";
- break;
- case 2:
- echo "[['42', '樂天溪鎮(zhèn)初級中學(xué)'],['43', '樂天溪鎮(zhèn)蓮沱初級中學(xué)']]";
- break;
- default:
- break;
- }
- ?>
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈