作者 主題: jquery big5傳至server變亂碼個人解決方式  (閱讀 4613 次)

0 會員 與 1 訪客 正在閱讀本文。

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
<!DOCTYPE html>
<HTML>
<HEAD>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="content-type" content="text/html; charset=Big5">
<Title>jquery使用ajax 加 後端 php5測試 (前端程式檔名:ajax_jquery_ok.php)</Title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function () {
  $('#btn').click(function (){
         $.ajax({
         url: 'ajax_server_ok.php',
         cache: false,
         dataType: 'html',
             type:'POST',
         contentType: 'application/x-www-form-urlencoded; charset=Big5',
         data: { County: $('#County').val(),SECTION: $('#SECTION').val()},
         error: function(xhr) {
           alert('Ajax request 發生錯誤');
         },
         success: function(response) {
                   $('#msg').html(response);
           $('#msg').fadeIn();
         }
     });
  });
 $('#clean').click(function(){
    $('#msg').html("");
 });
$("#loadingImg").ajaxStart(function(){
   $(this).show();
});
$("#loadingImg").ajaxStop(function(){
   $(this).hide();
});
})
</script>
</HEAD>
<BODY>
<div align="center">
Enter your name <br>
<input type="text" id="County" value="新北市">  <br>
<input type="text" id="SECTION" value="淡水區">  <br>
<input type="button" value="send" id="btn">
<input type="button" value="reset" id="clean">
<br><br><br>
<div id="msg"> </div>
</div>
</BODY>
</HTML>
« 上次編輯: 2013-11-11 15:04 由 tonyvan123 »

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
<?php
   $CCode1=mb_detect_encoding($_POST['County']);
   $SCode1=mb_detect_encoding($_POST['SECTION']);
   
   /* 自動判斷如是UTF-8和Big5則轉成Big5*/
   $iCounty = mb_convert_encoding($_POST['County'], "big5", "UTF-8,big5");
   $iSECTION = mb_convert_encoding($_POST['SECTION'],"big5", "UTF-8,big5");
   
   $CCode2=mb_detect_encoding($iCounty);
   $SCode2=mb_detect_encoding($SCode2);
   
   $iMSG=date("Ymd")."-".strval(intval(date("Hi")));
   
   if ($iCounty != "") {
      $db_link =  sybase_pconnect("myserver.com.tw:1433", "User", "Password);
      $syn_id_db = sybase_select_db("MYCOMP",$db_link);
      $strSQL="select a.ST_NO,b.ST_NM from CODE a left outer join BRANCH b on a.ST_NO=b.ST_NO  where BUYADD='".$iCounty."' AND BUYAD1='".$iSECTION."'";
      $res = sybase_query($strSQL, $db_link);
      $num_rows = sybase_num_rows($res);
      if ($num_rows > 0 ) {
         $row=sybase_fetch_array($res);
         $iPST_NO=mb_convert_encoding($row['ST_NO'],"UTF-8","UTF-8,big5,ASCII");     
         $iPST_NM=mb_convert_encoding($row['ST_NM'],"UTF-8","UTF-8,big5,ASCII");
        $PCode1=mb_detect_encoding($iPST_NM);
      }
      
      $PCode=mb_detect_encoding($iPST_NM);
      
      print "time:".$iMSG;
      print "-:-SQL:".mb_convert_encoding($strSQL,"UTF-8","UTF-8,big5,ASCII")."</br>";
      print  $CCode1.":".$SCode1."-:- ".$CCode2.":".$SCode2."-:- NM:".$PCode.":".$PCode1."</br>";
      
      print "-:-".mb_convert_encoding("分支","UTF-8","UTF-8,big5").":".$iPST_NO.$iPST_NM;
   } else {
      $iCounty='高雄市';
      $iSECTION='大社區';
      $iPST_NO="Z55";
      $iPST_NM="高雄分支";
   };
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="content-type" content="text/html; charset=Big5">
<title>jquery使用ajax 加 後端 php5測試 (後端程式檔名:ajax_server_ok.php)</title>
</head>
<body>
</body>
</html>
« 上次編輯: 2013-11-11 15:25 由 tonyvan123 »

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
jquery版本 v2.0.3
« 回覆 #2 於: 2013-11-11 14:57 »
jquery版本 v2.0.3
PHP版本: 5.3
apache 2.2

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
php擴充模組
« 回覆 #3 於: 2013-11-11 15:02 »
mb_convert_encoding和mb_detect_encoding此2個function需使用到mbstring這個extension模組,如未安裝此模組則需安裝此模組,此非常重要

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
取資料前的畫面

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
取資料後的畫面
由於此測試程式含有公司資料,因此把真實資料作了修改

tonyvan123

  • 活潑的大學生
  • ***
  • 文章數: 447
    • 檢視個人資料
以下是個人測試心得,如有謬誤煩請各位專家更正
1. 剛開始測試時並未使用mb_convert_encoding也未安裝php5的mbstring模組,此時出現幾個令我好奇的問題
1.1. 第一.傳至後端的新北市.淡水區回傳至前端時是正確的
1.2. 第二.而在後端回傳的確是預設值高雄市.大社區且是亂碼
1.3. 主機出現Incorrect syntax near '\xe5\x9c\x9f\xe5\x9f\x8e\xe5\x8d\x80'. 和 Unclosed quote before the character string ' '
1.4. 因此假設傳至後端的資料有2個可能,一個是已轉成UTF-8,另一個可能是仍為Big5碼但在中文字前端被加入了UTF-8的標記(才有1.3的問題),經測試的結果應該是仍為Big5碼但在中文字前端被加入了UTF-8的標記,因此如果用iconv會誤判,mb_convert_encoding可以正確的把這些標記拿掉但不會把原資料Big5破壞掉

2. 確定是編碼的問題,以下開如各種測試的組合
2.1. 前端加入contentType: 'application/x-www-form-urlencoded; charset=Big5'  ,結果問題依然在
2.2. 前後都加入<meta http-equiv="Content-Language" content="zh-tw">
      <meta http-equiv="content-type" content="text/html; charset=Big5">
     問題依然在
2.3. 朝著找後端的加解碼function,找到了mb_convert_encoding,終於成功了

PS: 心得ajax和jquery在傳資料至後端時一定會加入UTF-8標記,因此在後端需把這些標記拿掉(參考1.3),當後端的big5資料要回傳時也要加上UTF-8的標記
« 上次編輯: 2013-11-11 16:03 由 tonyvan123 »