特殊字符\u2028導致的Javascript腳本異常


這原本是個小錯誤,但排查花了不少時間,因此寫下來和大家分享一下。

起因

通過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   字節順序標記 空白

延伸閱讀

  1. Javascript特殊字符轉義字符對照表
  2. 關於Javascript使用的編碼格式,可以看這篇文章:Unicode與Javascript詳解
  3. 為什么Json庫返回的結果不能被Javascript正確解析?
    1. Javascript parse error on '\u2028' unicode character
    2. Javascript使用的Json庫處理特殊字符范例:JSON-js


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM