JSON text/html 不是有效的 MIME 類型

使用 AJAX dataType:"jsonp" 由 ASP 返回處理程序中出現了一些發者工具警告提示問題。
即使其 MIME 類型 text/html 不是有效的 JavaScript MIME 類型,仍已加載來自 因為它的 MIME 類型 "text/html" 不是 "text/css"。

var succeSsJSON = function (result) {
  result = JSON.parse(result);
};
$.ajax({
  type: "GET",
  url: "http://127.0.0.1/Update.asp",
  data: {
    doSuite: "Whois-Update",
    parser: location.host,
    varsion: "8.0.00000"
  },
  dataType: "jsonp",
  crossDomain: true,
  jsonpCallback: "JsonpCallback",
  cache: false,
  success: succeSsJSON,
  error: function (jqXHR, textStatus, errorThrown) {}
});

於是在處理程序 Update.asp 中加入 application/javascript

<%
Response.ContentType = "application/javascript"
Response.CharSet = "utf-8"
%>


JSON.parse: bad

另外因為返回處理的資料由 Access 讀取,發者工具警告提示。
Uncaught SyntaxError: JSON.parse: bad control character in string literal at line 1 column 11 of the JSON data.

一筆筆檢查後原因可能 Access 其欄位記錄資料中存在 TAB 的控制字元,導致 JSON.parse 解析的錯誤。
在處理的字符串文字中如果出現控製字符,例如 \t, \b, \r, \n 低於 ASCII 32 的任何字符容易出現 JSON.parse 錯誤。

需要再讀取記錄時先處理文字中出現的 Control Characters 控製字符,包含十六進制 \uXXXX Unicode 編碼字符。


JSON.parse(text [, reviver])

text 必要項。有效的 JSON 字串。
reviver 選擇項。用來轉換結果的函式。呼叫函式時,針對這個物件的每個成員進行呼叫。成員包含巢狀物件,則會先轉換巢狀物件,然後再轉換父物件。使用 JSON.stringify 將陣列轉換為 JSON 字串,然後使用 JSON.parse 將字串轉換回陣列。



jQuery AJAX contentType 編碼類型

jQuery 預設發送時編碼類型使用 application/x-www-form-urlencoded;charset=UTF-8。
但是如果設置 charset=big5 可能變亂碼類似 Server.URLEncode,當處理舊版本的 ASP 程式問題就很多、Server.URLEncode(String) 但是舊版本 ASP 3.0 接收時無法使用 URLDecode 來處理解碼。

考慮方案如果採用 JavaScript 發送參數時先以 window.btoa(unescape(encodeURIComponent(str))) 轉換,ASP 3.0 則接收 Server 需要寫出 Function 函數相容 window.atob 相當的解碼程式,解決亂碼問題。

window.btoa(unescape(encodeURIComponent('編碼類型')));  // 57eo56K86aGe5Z6L

經過 Base64 編碼後再將 57eo56K86aGe5Z6L 轉換回原本 '編碼類型' 的文字,雖然沒有亂碼,但是最好可以重新製作新時代系統 UTF-8 格式,才不會 Nightmare Again And Again 惡夢連連。