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

AJAX Asynchronous JavaScript and XML 通過 JavaScriptXML 技術的非同步請求和響應機制。在 AJAX 中可以通過使用 XMLHttpRequest 對象發送非同步請求到服務器,並接收服務器返回的數據,以實現動態更新網頁內容的功能、發送 AJAX 請求時,需要指定請求的編碼類型,以保證數據能夠正確地傳輸和解析。

使用 AJAX dataType : "jsonp" 由 Class ASP 返回處理程序中出現了一些發者工具警告提示問題。
其網際網路傳送的 (Multipurpose Internet Mail Extensions, MIME type) 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 String 字串。
reviver 選擇項。用來轉換結果的函式。呼叫函式時,針對這個物件的每個成員進行呼叫。成員包含巢狀物件,則會先轉換巢狀物件,然後再轉換父物件。使用 JSON.stringify 將陣列轉換為 JSON 字串,然後使用 JSON.parse 將字串轉換回陣列。



jQuery AJAX contentType 編碼類型

jQuery 預設發送時編碼類型使用 application/x-www-form-urlencoded;charset=UTF-8 編碼類型是 AJAX 預設的編碼類型,它通過將表單數據轉換成 URL Encoding 編碼字元串的方式進行數據傳輸。但是如果字符集設置 charset=big5 可能變亂碼類似 Server.URLEncode 當處理舊版本的 Class ASP 程式問題就很多、Server.URLEncode(String) 但是舊版本 ASP 3.0 接收時無法使用 URLDecode 來處理解碼。

考慮方案如果採用 JavaScript 發送參數時先以 window.btoa(unescape(encodeURIComponent(str))) 轉換,ASP 3.0 則接收服務器 Server 需要寫出 Function 函數相容 window.atob 相當的解碼程式,解決亂碼問題。編碼類型的選擇需要根據具體的需求和場景來進行選擇,例如如果需要傳輸大型二進製文件,就應該使用 multipart/form-data 編碼類型,如果需要傳輸 JSON 格式的數據,就應該使用 application/json 編碼類型。


encodeURIComponent 編碼類型

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

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




ASP.NET 編碼 To Encode

將字串進行編碼和解碼。使用正確的編碼方式可以確定數據的正確性和安全性,開發者需要根據具體情況選擇適當的編碼方式,以方便在網絡上傳輸和存儲。

ASP.NET (.ASPX)

ASP.NET 中的 ToBase64String 將指定唯讀範圍內八位元不帶正負號的「整數轉換」為使用 Base-64 位數編碼的對等字串表示,基於 Base64 編碼字串轉換方式。Base64 編碼為常用的數據編碼方式,它將二進製數據轉換為 ASCII 字元串,通常用於在網路上傳輸二進製數據。ToBase64String 方法是 System.Convert 的一部分,可以在 ASP.NET 中使用。接收 byte 位元組的參數,返回 Base64 編碼的字符串。使用 ToBase64String 方法可以採用二進製數據和 Text 文字數據之間的轉換,在 ASP.NET 應用於數據傳輸和 Encryption 加密等方面應用。

Convert.ToBase64String(Encoding.UTF8.GetBytes("編碼類型"))
Encoding.UTF8.GetString(Convert.FromBase64String("57eo56K86aGe5Z6L="))

主要仍然是使用 IIS (Internet Information Services) 的 Web Server 網站伺服器軟體相應的編碼方式設定,其資料的傳遞問題,或是採用 JavaScript Fetch API 資源的接口請求編碼類型轉換之間的對應。