這原本是個(gè)小錯(cuò)誤,但排查花了不少時(shí)間,因此寫下來(lái)和大家分享一下。
起因
通過(guò)Ajax動(dòng)態(tài)從后臺(tái)讀取文章內(nèi)容,并顯示在頁(yè)面上,加載到某篇文章的時(shí)候,報(bào)javascript語(yǔ)法錯(cuò)誤,無(wú)法顯示文章內(nèi)容。
Ajax從后臺(tái)讀取時(shí)返回的數(shù)據(jù)格式為Json,使用Newtonsoft.Json庫(kù)來(lái)組裝Json。
分析原因
因?yàn)槠渌恼驴梢哉<虞d,僅有一篇文章報(bào)Javascript語(yǔ)法錯(cuò)誤,所以可以大致確定是文章內(nèi)容導(dǎo)致的異常。把文章內(nèi)容貼到寫字板中仔細(xì)查找,發(fā)現(xiàn)有幾個(gè)小黑方塊,手工去掉這幾個(gè)小黑方塊后,加載正常。
復(fù)制這個(gè)方塊到程序中,在BigEndianUnicode編碼(注:Javascript的編碼格式為UCS-2,與BigEndianUnicode兼容)下轉(zhuǎn)換為字節(jié)數(shù)組,寫到控制臺(tái)上,程序和結(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)上查詢得知,這個(gè)編碼為2028的字符為行分隔符,會(huì)被瀏覽器理解為換行,而在Javascript的字符串表達(dá)式中是不允許換行的,從而導(dǎo)致錯(cuò)誤。
解決方法
把特殊字符轉(zhuǎn)義替換即可,代碼如下所示:
str = str.Replace("\u2028", "\\u2028");
替換后,用之前有問(wèn)題的文章測(cè)試,加載正常,問(wèn)題解決。
另外,Javascript中的特殊字符一共有13個(gè),建議都進(jìn)行轉(zhuǎn)義處理,如下:
Unicode 字符值 | 轉(zhuǎn)義序列 | 含義 | 類別 |
---|---|---|---|
\u0008 | \b | Backspace | |
\u0009 | \t | Tab | 空白 |
\u000A | \n | 換行符(換行) | 行結(jié)束符 |
\u000B | \v | 垂直制表符 | 空白 |
\u000C | \f | 換頁(yè) | 空白 |
\u000D | \r | 回車 | 行結(jié)束符 |
\u0022 | " | 雙引號(hào) (") | |
\u0027 | ' | 單引號(hào) (') | |
\u005C | \ | 反斜杠 () | |
\u00A0 | 不間斷空格 | 空白 | |
\u2028 | 行分隔符 | 行結(jié)束符 | |
\u2029 | 段落分隔符 | 行結(jié)束符 | |
\uFEFF | 字節(jié)順序標(biāo)記 | 空白 |
延伸閱讀
Javascript特殊字符轉(zhuǎn)義字符對(duì)照表。
關(guān)于Javascript使用的編碼格式,可以看這篇文章:Unicode與Javascript詳解。
為什么Json庫(kù)返回的結(jié)果不能被Javascript正確解析?Javascript parse error on '\u2028' unicode character。
Javascript使用的Json庫(kù)處理特殊字符范例:JSON-js。