當文本要按照字符進行打點時厕吉,需要注意不是所有語言都適合。
發(fā)現(xiàn)問題
中東地區(qū)運營人員反饋吹害,紅框圈出來的兩處阿拉伯文本顯示異常均函,可以參考正文內容是正常的亿虽。
定位原因
現(xiàn)在讓昵稱區(qū)和正文區(qū)顯示同一段文本,可見確實有所不同:
通過代碼對比發(fā)現(xiàn)边酒,區(qū)別在于是否對文本進行“空格替換”:
text.replaceAll('', '\u200b')
\u200b
是個寬度為0的空格经柴,那么替換的作用是什么呢?舉個例子如下圖墩朦,這里展示現(xiàn)支持的所有語言坯认,左邊是一端段完整文本,右邊是限制了文本可展示寬度后的打點效果氓涣,可以看到牛哺,默認情況下會按照單詞進行打點。
大多數(shù)場景這種打點規(guī)則其實沒什么問題劳吠,但有些場景就不太行了引润。試想下如果用戶昵稱是如
“AAAAAAAAAAAAAAAAAAAAAAAA”這種較長且連續(xù)的單詞,一旦被打點就會被完全省略成“...”痒玩,再比如一些固定寬度的按鈕淳附,希望是盡可能多地填滿而不是留一塊空格议慰。其實就是按照字符打點,所以引入“零寬空格”把每個字符隔開當作單獨的“單詞”奴曙,打點效果如圖:
看起來不錯别凹,但眼尖的可能會發(fā)現(xiàn)阿拉伯語在打點前后發(fā)生變化了,這是因為阿拉伯字母有著復雜的變形規(guī)則:
計算機在顯示阿拉伯字母時洽糟,會根據(jù)選擇阿拉伯字母的書寫風格炉菲、當前選擇的字體、顯示位置坤溃、書寫空間等情況拍霜,將字母原型經過Shape(字母位置變形)、Ligature(字母連寫變形)薪介、Diacritics(字母標注變元音符號變形)祠饺、Kashida(為了湊滿一整行字母延長變形)、Tatwell(插入字母鏈接符號)等等一系列的操作昭灵,才可以將一段阿拉伯字母渲染輸出吠裆。
其中伐谈,最主要的變形是Shape和Ligature烂完。用漢語來粗略比喻,就像“不好”要顯示成“孬”诵棵、“混凝土”要顯示成“砼”抠蚣、“不用”要顯示成“甭”等等。
解決辦法
因此不能隨便在阿拉伯字母中插入其他字符履澳,這會影響到其變形規(guī)則導致錯誤嘶窄。解決辦法是先保證其正確顯示,這里判斷下不再對阿拉伯語進行替換:
static String getSpaceReplaceText(String text) {
if (UserInfoHolder.lang.toLowerCase().startsWith("ar")) {
return text;
}
return text.replaceAll('', '\u200b');
}
然后再考慮打點的問題距贷,事實上阿拉伯字母的連寫規(guī)則本身就有縮短文本寬度的目的柄冲,甚至之前經過替換后由于展示不下被打點的文本,改成不替換后反倒能完全展示了忠蝗。
總結
除了阿拉伯語有使用阿拉伯字母现横,波斯語、達里語阁最、哈薩克語戒祠、中國的維吾爾語等也在應用,當前尚未引入相關地區(qū)語言速种,因此如果涉及到這些地區(qū)姜盈,同樣的都不能進行替換。