這原本是個小錯誤,但排查花了不少時間,因此寫下來和大家分享一下。
起因
通過Ajax動態從后台讀取文章內容,並顯示在頁面上,加載到某篇文章的時候,報javascript語法錯誤,無法顯示文章內容。
Ajax從后台讀取時返回的數據格式為Json,使用Newtonsoft.Json庫來組裝Json。
分析原因
因為其它文章可以正常加載,僅有一篇文章報Javascript語法錯誤,所以可以大致確定是文章內容導致的異常。把文章內容貼到寫字板中仔細查找,發現有幾個小黑方塊,手工去掉這幾個小黑方塊后,加載正常。
復制這個方塊到程序中,在BigEndianUnicode編碼(注:Javascript的編碼格式為UCS-2,與BigEndianUnicode兼容)下轉換為字節數組,寫到控制台上,程序和結果如下:
public void Test1() { string str = @" "; byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str); foreach(byte b in bytes) { Console.Write(b.ToString("x2")); } }
結果為:2028
網上查詢得知,這個編碼為2028的字符為行分隔符,會被瀏覽器理解為換行,而在Javascript的字符串表達式中是不允許換行的,從而導致錯誤。
解決方法
把特殊字符轉義替換即可,代碼如下所示:
str = str.Replace("\u2028", "\\u2028");
替換后,用之前有問題的文章測試,加載正常,問題解決。
另外,Javascript中的特殊字符一共有13個,建議都進行轉義處理,如下:
Unicode 字符值 | 轉義序列 | 含義 | 類別 |
---|---|---|---|
\u0008 | \b | Backspace | |
\u0009 | \t | Tab | 空白 |
\u000A | \n | 換行符(換行) | 行結束符 |
\u000B | \v | 垂直制表符 | 空白 |
\u000C | \f | 換頁 | 空白 |
\u000D | \r | 回車 | 行結束符 |
\u0022 | \" | 雙引號 (") | |
\u0027 | \' | 單引號 (') | |
\u005C | \\ | 反斜杠 (\) | |
\u00A0 | 不間斷空格 | 空白 | |
\u2028 | 行分隔符 | 行結束符 | |
\u2029 | 段落分隔符 | 行結束符 | |
\uFEFF | 字節順序標記 | 空白 |
延伸閱讀
- Javascript特殊字符轉義字符對照表。
- 關於Javascript使用的編碼格式,可以看這篇文章:Unicode與Javascript詳解。
- 為什么Json庫返回的結果不能被Javascript正確解析?
- Javascript parse error on '\u2028' unicode character。
- Javascript使用的Json庫處理特殊字符范例:JSON-js。