摘要:在各種論壇上,經常會看到一些奇怪的字符,它們的內容會超出顯示范圍,舉個例子常見的還有一些有泰文字符組成的。第一種是對字符串文字區域設置最大高度,超出的部分自動隱藏。將附加字符進行過濾,這種方法在某種程度上會誤殺一些需要正常顯示的附加符號。
在各種論壇上,經常會看到一些奇怪的字符,它們的內容會超出顯示范圍,
舉個例子:
"Z??????????????????A????????L?????G????????????O??????????!????????????????"
常見的還有一些有泰文字符組成的。這里就不舉例子了。這些看似亂文的字符是怎么形成的呢?
其實它們并不是亂文,嘗試輸出上面那個例子的字符長度
"Z??????????????????A????????L?????G????????????O??????????!????????????????".length; //75
發現竟然包含了75個字符!我們用Array.from輸出這些字符:
Array.from("Z??????????????????A????????L?????G????????????O??????????!????????????????"); //["Z", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "A", "?", "?", "?", "?", "?", "?", "?", "?", "L", "?", "?", "?", "?", "?", "G", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "O", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "!", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]
再查看其中某個字符的Unicode碼點:
Array.from("Z??????????????????A????????L?????G????????????O??????????!????????????????")[10].codePointAt(0);//793,即16進制的0x0319
根據Unicode映射表查找出0x0319對應的字符,發現U+0300~U+036F稱為結合附加符號,那么結合附加符號又是什么?
附加符號,是添加在字母上面的符號,以更改字母的發音或者以區分拼寫相似詞語。例如漢語拼音字母“ü”上面的兩個小點,或“á”、“à”字母上面的標調符。變音符號可以放在字母的上方或下方,也可以放在其他的位置。當多個附加符號疊加的時候,就形成了看起來像亂碼的符號。
而在泰文中,字符的組成也是由一些元音符號和聲調符號組成的
所以多個元音符號或聲調符號疊加時也會有類似的效果。這里就不再做闡述。
在網頁開發中,特別是評論區,如果遇到太多的"插樓"字符,就會對其他用戶造成閱讀障礙,影響閱讀體驗,那怎么避免這種情況呢。這里提供兩種方法。
第一種是對字符串文字區域設置最大高度,超出的部分自動隱藏。
p { height: 20px; overflow: hidden; }
另一種方式就是對這種特殊字符做過濾操作。將附加字符進行過濾,這種方法在某種程度上會誤殺一些需要正常顯示的附加符號。但一般也不會影響整體功能,利大于弊。
var regexSymbolWithCombiningMarks = /([