老是有人弄什麼乙個中文字算兩個西文字這種問題,一般而言這種問題是極其愚蠢的。為什麼乙個中文字要算兩個西文字呢?
有些人做前端算寬度(比如顯示標題要截掉一些字以免放不下),但是在絕大多數場景下,使用比例字型的西文的寬度是不等寬的,也不可能是中文字的一半寬。況且除了中文、西文,還有其他文字呢?比如藏文、維吾爾語等,你算乙個還是兩個?【不要跟我說你只考慮中英文,連少數民族的語言文字都他媽不支援,鳥語倒支援個起勁,還好意思說什麼民族團結?】
對於標題擷取這種需求,合理的對策是用css,對於css支援不夠的,可以用指令碼來計算。簡單來說就是把一串字放在乙個隱藏容器裡量一下,然後擷取到指定長度以內。如果用canvas text api,更是非常簡單的。
另一些人說是要存資料庫。但是他媽誰告訴你資料庫裡儲存的時候就是乙個中文字對兩個西文字?拜託補習一下基本的編碼常識。乙個漢字對兩個英文本母那都是古老的雙位元組編碼了。不說unicode,gb18030-2005包含70000+字元,顯然會有超過雙位元組的情況。如果你還在用gb2312、gbk,那問題同上,怎麼存藏文、維吾爾語等……
拋開這些本身就不合理的需求,但是仍然有少數需求是需要考慮漢字的特殊性的。那就是排版。在排版中,漢字(準確說是中日韓越文字)是直接按照方塊字來排的,而其他語言的字元通常要變寬處理。
那麼到底哪些字元是方塊呢?
如果看看輸入法就知道,一直到現在我們都還有全形(fullwidth)、半形(halfwidth)的區分。全形就是方塊字,而半形則是半個方塊字。實際上這是從legacy encoding+早期等寬字型遺留下來的。在unicode規範裡,對東亞字元的這種特殊屬性做了更詳細的闡述,具體可參考:[url]
這裡就簡單的根據unicode資料庫來給出到底哪些字元是「全形字符」。
1100..115f
11a3..11a7
11fa..11ff
2329,232a
2e80..4dbf (去掉303f)
4e00..a4cf
a960..a97f
ac00..d7ff
f900..faff
fe10..fe1f
fe30..fe6f
ff01..ff60
ffe0..ffe7
1f200..3ffff
以正規表示式來寫就是:
/[\u1100-\u115f\u11a3-\u11a7\u11fa-\u11ff\u2329\u232a\u2e80-\u303e\u3040-\u4dbf\u4e00-\ua4cf\ua960-\ua97f\uac00-\ud7ff\uf900-\ufaff\ufe10-\ufe1f\ufe30-\ufe6f\uff01-\uff60\uffe0-\uffe7]/
注意,u+303f雖然是在cjk標點符號區,但是只有它卻不是全形的,這個罕用符號表示半個漢字的空間。
另外u+3248到u+324f嚴格說也不是全形的,在unicode規範裡歸為(a)mbiguous類,意思是在特定上下文裡(如東亞文字裡)可以是全形的,而在其他上下文裡則是半形的。a類的字元還有很多,比如雙引號、間隔號等,在西文字型裡都有這些字元,當然也不可能是按照全形方塊字來設計的。
因為實際的字元寬度取決於語言及字型選擇等因素,所以我暫時並不直接將a類歸入全形。只有u+3248到u+324f在大多數字型裡根本都不支援,因此就馬虎點按全形算了。
DV,OV,EV到底有哪些區別
ca b論壇將國際主流ca簽發的證書通過證書審核的內容劃分為3種型別,分別是 dv,ov,ev型別。下面讓我們來詳細的了解下,不同的證書型別到底有什麼區別,證書驗證的方式有什麼不同。dv型別證書 中文全稱是網域名稱驗證型證書,證書審核方式為通過驗證網域名稱所有權即可簽發證書。此型別證書適合個人和小微...
什麼是全形字符
就是太陽和月亮的區別,鍵盤上有!你可以用 shift 空格 鍵來切換全形和半形 或者用英文輸入 簡單地講,全形字符占用2個字元位置,半形字元占用1個字元位置。他們在應用上的區別主要表現在輸入阿拉伯數目字 英文本母 標點符號 特殊符號,這些只需要佔1個字元位的一般用半形輸入。如果用全形輸入的話,每兩個...
java 全形字符轉半形字元
專案中正好要用到全半形字元互轉,收藏下以後備用 public class test 全形空格為12288,半形空格為32 其他字元半形 33 126 與全形 65281 65374 的對應關係是 均相差65248 將字串中的全形字符轉為半形 param src 要轉換的包含全形的任意字串 retur...