Encode

在數位世界的浩瀚星海中,有一種神秘的語言穿梭於不同的系統之間,它就是 JSON。今天,讓我們踏上一場探索編碼奧秘的旅程,揭開 Unicode 轉義背後的故事。


🔑 JSON:穿越語言邊界的使者

JSON(JavaScript Object Notation)如同一位精通多國語言的外交官,肩負著在不同系統、不同語言之間搭建溝通橋梁的使命。

想像這樣一個場景:後端是 .NET 的城堡,前端是 JavaScript 的王國,而客戶端則散布在中文的故鄉、英文的海島、日文的群山、以及阿拉伯文的沙漠… 在這個多元的數位世界中,JSON 承載著一個偉大的使命:確保所有的字元都能安全抵達目的地,不會在旅途中因為編碼的差異而迷失自我。



🔑 Unicode Escape:JSON 的守護神咒

在 JSON 的世界中,存在著一種古老而強大的保護咒語:Unicode 轉義序列。

這個神奇的 \uXXXX 符號就像是文字的化身術,能夠將非英文字符轉化為數字密碼。比如說,當「你」這個字要穿越網路的險境時,它會化身為 \u4f60,而「好」字則變成了 \u597d

這種變身術的智慧在於:無論是年邁的瀏覽器長者,還是古老的伺服器守衛,只要它們能夠理解 JSON 的語言,就能夠施展逆轉咒語,將這些數字密碼還原成真正的中文字符。這樣的設計大大降低了因編碼不一致而產生亂碼魔咒的風險。



🔑 ASP.NET Core:安全至上的王國法則

在 ASP.NET Core 的數位王國中,JsonResult 如同一位謹慎的宮廷侍衛,它的背後站著強大的 System.Text.Json 序列化衛士。

這位衛士天生具有安全意識,它會自動將所有非 ASCII(非英文)的字符轉換成 Unicode 轉義序列。不僅如此,它還會特別留意那些可能被誤認為 HTML 特殊字符的危險分子(如 <>),並將它們一併處理。

這種謹慎的作風有著深遠的考量:

  • 兼容性護盾:保護那些「只認識 ASCII 字符」的古老客戶端、瀏覽器或中間代理
  • 安全屏障:築起一道防線,抵禦潛在的跨站腳本攻擊(XSS)的入侵


🔑 Razor Page 實驗室的發現之旅

讓我們走進實驗室,探索一個有趣的現象。根據 ASP.NET Core JSON 中文編碼問題與序列化參數設定 這篇研究報告的指引,我們進行了一場編碼實驗。

實驗現象:舊版本的神秘變身

在舊版 ASP.NET Core 的 Razor Pages 中,當我們讓 JsonResult 攜帶中文訊息踏上瀏覽器之旅時,會發現一個有趣的現象:

原本期待看到的溫馨訊息:

1
2
3
{
"Message": "你好"
}

卻變成了神秘的密碼形式:

1
2
3
{
"Message": "\u4f60\u597d"
}

破解密碼的法術:Encoder 設定

這個現象的背後,是 Encoder 設定在施展魔法。我們可以在 AddRazorPages 時念出特殊的咒語,讓中文字符保持原本的美麗模樣:

1
2
3
4
5
6
7
8
9
10
services.AddRazorPages()
.AddJsonOptions(options =>
{
// 保持屬性名稱的原始風貌,不強制轉換首字母大小寫
options.JsonSerializerOptions.PropertyNamingPolicy = null;

// 開啟中日韓文字的通行證,讓它們在 JSON 世界中自由穿行
options.JsonSerializerOptions.Encoder =
JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs);
});

時代的進步:.NET 8 的新篇章

值得慶祝的是,在 .NET 8 的新時代裡,這個古老的困擾已經成為歷史。現代的 .NET 8 王國已經內建了更智慧的編碼機制,讓開發者能夠更專注於創造美好的應用程式,而不必為編碼問題煩惱。




🔑 編碼詩篇的尾聲

在這場編碼的探索之旅中,我們見證了 JSON 如何成為跨越語言邊界的使者,了解了 Unicode 轉義如何成為文字的守護神咒,也體驗了 ASP.NET Core 安全至上的王國法則。

從舊版本的神秘變身到現代 .NET 8 的智慧進化,這不僅僅是技術的演進,更是開發者體驗不斷提升的見證。在數位世界的詩篇中,每一行程式碼都承載著創造者的智慧與用心。

願我們在編碼的道路上,既能欣賞技術的美妙,也能理解設計背後的深層考量。畢竟,最美的程式碼,往往是那些能夠優雅地解決問題,同時保護使用者安全的作品。