這原本是個小錯誤摧莽,但排查花了不少時間,因此寫下來和大家分享一下顿痪。
起因
通過Ajax動態(tài)從后臺讀取文章內(nèi)容镊辕,并顯示在頁面上,加載到某篇文章的時候蚁袭,報javascript語法錯誤征懈,無法顯示文章內(nèi)容。
Ajax從后臺讀取時返回的數(shù)據(jù)格式為Json揩悄,使用Newtonsoft.Json庫來組裝Json卖哎。
分析原因
因為其它文章可以正常加載,僅有一篇文章報Javascript語法錯誤,所以可以大致確定是文章內(nèi)容導(dǎo)致的異常亏娜。把文章內(nèi)容貼到寫字板中仔細查找焕窝,發(fā)現(xiàn)有幾個小黑方塊,手工去掉這幾個小黑方塊后维贺,加載正常它掂。
復(fù)制這個方塊到程序中,在BigEndianUnicode編碼(注:Javascript的編碼格式為UCS-2溯泣,與BigEndianUnicode兼容)下轉(zhuǎn)換為字節(jié)數(shù)組群发,寫到控制臺上,程序和結(jié)果如下:
public void Test1()
{
string str = @"";
byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str);
foreach(byte b in bytes)
{
Console.Write(b.ToString("x2"));
}
}
結(jié)果為:2028
網(wǎng)上查詢得知发乔,這個編碼為2028的字符為行分隔符,會被瀏覽器理解為換行雪猪,而在Javascript的字符串表達式中是不允許換行的栏尚,從而導(dǎo)致錯誤。
解決方法
把特殊字符轉(zhuǎn)義替換即可只恨,代碼如下所示:
str = str.Replace("\u2028", "\\u2028");
替換后译仗,用之前有問題的文章測試,加載正常官觅,問題解決纵菌。
另外,Javascript中的特殊字符一共有13個休涤,建議都進行轉(zhuǎn)義處理咱圆,如下:
Unicode 字符值 | 轉(zhuǎn)義序列 | 含義 | 類別 |
---|---|---|---|
\u0008 | \b | Backspace | |
\u0009 | \t | Tab | 空白 |
\u000A | \n | 換行符(換行) | 行結(jié)束符 |
\u000B | \v | 垂直制表符 | 空白 |
\u000C | \f | 換頁 | 空白 |
\u000D | \r | 回車 | 行結(jié)束符 |
\u0022 | " | 雙引號 (") | |
\u0027 | ' | 單引號 (') | |
\u005C | \ | 反斜杠 () | |
\u00A0 | 不間斷空格 | 空白 | |
\u2028 | 行分隔符 | 行結(jié)束符 | |
\u2029 | 段落分隔符 | 行結(jié)束符 | |
\uFEFF | 字節(jié)順序標記 | 空白 |
延伸閱讀
Javascript特殊字符轉(zhuǎn)義字符對照表。
關(guān)于Javascript使用的編碼格式功氨,可以看這篇文章:Unicode與Javascript詳解序苏。
為什么Json庫返回的結(jié)果不能被Javascript正確解析?Javascript parse error on '\u2028' unicode character捷凄。
Javascript使用的Json庫處理特殊字符范例:JSON-js忱详。