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