整理Unicode 經常會使用到的內碼區域並透過Regex 自動比對 ...

文章推薦指數: 80 %
投票人數:10人

UTF-8 相容於ASCII 的文字範圍 ... 簡單來說,就是「所有的漢字」都在這個範圍裡,包含正體中文、簡體中文與日文、韓文、越南文裡的漢字。

←如何在.NETCore主控台專案中使用DI(相依注入)並取得ILogger服務 在OfficeforMac設計PowerPoint範本時會踩到的字型地雷→ 最近有個案子需要設法過濾表單中輸入的文字,有些欄位只能輸入英數字,有些則必須自動轉全形文字,還有些只能輸入中文,有些不允許輸入標點符號。

這個需求照理說很簡單,透過RegularExpression一下子就可以達陣,但是光是完成這功能實在太無趣了,所以晚上徹底的研究並整理所有的Unicode編碼,發現許多有趣的冷知識。

本篇文章我打算整理出常用的Unicode內碼區域,並透過JavaScript正則表示式(RegularExpression)比對出這些文字,有些Patterns應該蠻實用的,可以直接複製貼上回去使用。

UTF-8相容於ASCII的文字範圍 數字(Numbers) [0-9] [\u0030-\u0039] 英文字母(Alphabets) [A-Za-z] [\u0041-\u005A\u0061-\u007A] 空白字元(Space) [] [\s] [\u0020] 控制字元(ControlCodes)(共65個字元,包含DEL但不包含SP空白字元) C0包含\u0000-\u001F\u007F,C1包含\u0080-\u009F [\u0000-\u001F\u007F\u0080-\u009F] 標點符號(Punctuation&Symbols) [\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E] [~!@#$%^&*()_+=\-`\[\]{}';:".,<>/?\|] 基本拉丁文字(BasicLatin)(包含字母、數字與標點符號) [\u0020-\u002F\u0030-\u0039\u003A-\u0040\u0041-\u005A\u005B-\u0060\u0061-\u007A\u007B-\u007E] 超出ASCII範圍的補充拉丁文字(較少用到) Latin-1補充文字(Latin-1Supplement)(中文鍵盤打不出來的字) [\u00A0-\u00BF\u00C0-\u003FF] Latin擴充文字A(LatinExtended-A)(中文鍵盤打不出來的字) [\u0100-\u017F] Latin擴充文字B(LatinExtended-B)(中文鍵盤打不出來的字) [\u0180-\u024F] Latin擴充附加文字(LatinExtendedAdditional)(中文鍵盤打不出來的字) [\u1E02-\u1EF3] 漢字Unicode範圍(Hanunification) 中日韓統一表意文字列表(CJKUnifiedIdeographs) 簡單來說,就是「所有的漢字」都在這個範圍裡,包含正體中文、簡體中文與日文、韓文、越南文裡的漢字。

[\u4E00-\u9FFF] 中日韓統一表意文字擴展區A(CJKUnifiedIdeographsExtensionA) 這是1997年提出的擴充漢字,大多是罕見字,所有文字都不存在於Big5編碼中。

有些俗稱的「難字」有可能會落在這區Unicode文字中。

[\u3400-\u4DBF] 中日韓相容表意文字區(CJKCompatibilityIdeographs)(不建議使用的區域) 這區的文字是指中日韓越統一表意文字中因為字源分離原則未與正式字集(包括擴展A、B、C、D區)中的字形統一的字。

[\uF900-\uFAFF] ※簡單來說,這區的文字不要用,因為許多「第三方字型」都沒有實作這個區域的文字。

全形空白 [\u3000] 中日韓相容形式(CJKCompatibilityForms)(不建議使用的區域) 對於一些「垂直書寫」的文字系統中會用到的標點符號,都集中整理到這個區域內。

不建議使用。

[\uFE30-\uFE4F] 中日韓標點符號(CJKSymbolsandPunctuation)(沒有包含所有全形標點符號) 在中日韓語中經常使用的標點符號,都會出現在這個區域內。

以下Patterns包含全形空白(\u3000): [\u3000\u3001-\u303F] 但台灣常用與中文書寫相關的標點符號(括弧、頓號、句號),應該只有以下這些: [\u3000-\u3003\u3008-\u300F\u3010-\u3011\u3014-\u3015\u301C-\u301E] 全形英文或標點符號(HalfwidthandFullwidthForms) [\uFF01-\uFF5E] 這個區域比較有趣的地方是,這些全形英文與全形標點符號的排列順序,剛好跟ASCII的排列順序一樣。

這也意味者,我們只要將特定範圍內的ASCII內碼,加上65248(FEE0)偏移量,就會自動算出全形的Unicode文字。

以下就是我用JavaScript寫成的半形轉全形範例程式,這裡的MagicNumber65248就是這麼來的! functionhalf2full(str){ letlen=str.length; letres=[]; for(leti=0;i=0x21&&c<=0x7e){ res.push(String.fromCharCode(c+65248)); }else{ res.push(str[i]); } } returnres.join(''); } 常用Unicode符號 空白字元(Whitespacecharacter) 有寬度的空白字元 [\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028-\u2029\u202F\u205F\u3000] 零寬度的空白字元(zerowidthwhitespaces) [\u180E\u200B-\u200D\u2060\uFEFF] 空白的替代字元(有形的空白字元) 當需要特別強調空白字元或是在列印輸出時想特別告知這是空白時,可以用的空白替代字元。

詳見Substitutes連結。

[\u00B7\u237D\u2420\u2422\u2423] 通用Unicode標點符號(GeneralPunctuation) [\u2000-\u206F] Unicode使用者造字區(PrivateUseArea) 如果你真的需要用到Unicode尚未定義的文字,可以使用以下區域: [\uE000-\uF8FF] ※這個區域可以讓你自訂6,400個字,應該是綽綽有餘! BIG5與Unicode的使用者造字區對應 BIG5是一套雙位元組字元集,使用了雙八碼儲存方法,以兩個位元組來組成一個中文字。

第一個位元組稱為「高位位元組」,第二個位元組稱為「低位位元組」。

BIG5中「高位位元組」使用了0x81-0xFE(共126個字元),「低位位元組」使用了0x40-0x7E與0xA1-0xFE(僅使用157個字元),最多只能定義19,782個字碼。

在BIG5編碼中,共定義出四個使用者造字區: 0xFA40~0xFEFE對應到Unicode編碼的U+E000~U+E310](總共785個字) 0x8E40~0xA0FE對應到Unicode編碼的U+E311~U+EEB7](總共2,983個字) 0x8140~0x8DFE對應到Unicode編碼的U+EEB8~U+F6B0](總共2,041個字) 0xC6A1~0xC8FE對應到Unicode編碼的U+F6B1~U+F848](總共408個字) 如果你的系統需要跟BIG5相容,那麼你應該只能使用上述範圍的Unicode編碼,此時你的正則表示式應該改寫如下: [\uE000-\uF848] 關於BIG5與Unicode的字碼對應表 由於大家比較耳熟能詳的是BIG5編碼,但其實在Windows作業系統中,預設內建的是CP950編碼,他擴充了一些BIG5缺少的常用文字與符號,例如它在F9D6-F9FE添加了7個倚天中文系統增加的字元「碁銹裏墻恒粧嫺」和34個畫圖和製表符號(參見程式碼頁面950-維基百科,自由的百科全書說明)。

由於CP950到Unicode之間並沒有特定的順序,也沒有公式可以轉換(只有造字區有公式可以轉換),所以必須靠查表的方式逐一對應才行。

在Unicode.org官網上有提供完整的CP950到Unicode的對應表,下載之後就可以輕易做出一份自己的對應表。

這裡有幾個常用的BIG5內碼區域,方便日後查表參考: 0xA140-0xA3BF:標點符號、希臘字母及特殊符號,包括在0xA259-0xA261,安放了九個計量用漢字:兙兛兞兝兡兣嗧瓩糎。

0xA440-0xC67E:常用漢字,先按筆劃再按部首排序。

0xC940-0xF9D5:次常用漢字,亦是先按筆劃再按部首排序。

相關連結 Unicode-Wikipedia UTF-8-Wikipedia(中文) Unicode11.0.0-2018June5 ListofUnicodecharacters-Wikipedia Unicode/Characterreference/0000-0FFF Hanunification-Wikipedia Unicoderanges CJKcharacters-Wikipedia CJKUnifiedIdeographs-Wikipedia ListofCJKfonts-Wikipedia 大五碼-維基百科,自由的百科全書(Big5) Codepage950-Wikipedia Big5CodeTables Unicode補完計畫-維基百科,自由的百科全書 ISO10646漢字查詢系統 CP950到Unicode的對應表 BIG5到Unicode的對應表 javascript-HowtouseregularexpressiontovalidateChineseinput?-StackOverflow 相關文章 整理Unicode經常會使用到的內碼區域並透過Regex自動比對文字 最近有個案子需要設法過濾表單中輸入的文字,有些欄位只能輸入英數字,有些則必須自動轉全形文字,還有些只能輸入中文,有些不允許輸入標點符號。

這個需求照理說很簡單,透過RegularExpression 分享幾個在Windows與Linux常見的編碼問題與解決方案 我每隔幾年我就會遇到一次non-Unicode的編碼問題,真的不常見,但這些年來也處理過無數次了,每次都被搞的很煩。

最近在Linux環境又遇到棘手的編碼問題,檔案內容是從ISO-8859-1 整理一些Regex的學習資源 我第一次接觸RegularExpression(正規表示式,樣式比對)是8年前在學Perl程式語言的時候,當初一開始接觸RegularExpression時好像看到無字天書一樣... 工商服務(廣告) 每月文章 2022 十月(5) 九月(17) 八月(10) 七月(11) 六月(4) 五月(10) 四月(5) 三月(9) 二月(9) 一月(15) 2021 十二月(12) 十一月(5) 十月(6) 九月(13) 八月(16) 七月(13) 六月(13) 五月(7) 三月(1) 二月(1) 2020 十二月(3) 十一月(1) 十月(3) 九月(7) 八月(7) 七月(9) 六月(2) 五月(5) 三月(4) 二月(5) 一月(4) 2019 十二月(7) 十一月(2) 十月(5) 九月(1) 六月(3) 四月(4) 三月(3) 二月(7) 一月(12) 2018 十二月(3) 十一月(1) 十月(4) 九月(12) 八月(4) 六月(2) 五月(3) 四月(6) 二月(1) 一月(2) 2017 十二月(2) 十月(3) 九月(4) 七月(1) 六月(1) 五月(1) 四月(1) 二月(3) 一月(4) 2016 十二月(4) 十一月(1) 十月(1) 九月(4) 八月(3) 七月(2) 五月(1) 四月(1) 三月(3) 二月(3) 一月(2) 2015 十二月(6) 十一月(4) 十月(3) 九月(5) 八月(1) 七月(4) 六月(2) 五月(3) 四月(1) 三月(1) 二月(3) 一月(2) 2014 十二月(3) 十一月(2) 十月(3) 九月(3) 八月(1) 七月(4) 六月(2) 五月(4) 四月(5) 三月(4) 二月(1) 一月(7) 2013 十二月(1) 十一月(8) 十月(1) 九月(2) 八月(4) 七月(5) 六月(8) 五月(9) 四月(8) 三月(10) 二月(9) 一月(10) 2012 十二月(4) 十一月(6) 十月(6) 九月(4) 八月(5) 七月(10) 六月(5) 五月(6) 四月(10) 三月(12) 二月(1) 一月(6) 2011 十二月(3) 十一月(7) 十月(8) 九月(14) 八月(15) 七月(10) 六月(10) 五月(11) 四月(11) 三月(13) 二月(14) 一月(13) 2010 十二月(13) 十一月(10) 十月(16) 九月(17) 八月(12) 七月(22) 六月(15) 五月(11) 四月(14) 三月(17) 二月(17) 一月(26) 2009 十二月(16) 十一月(18) 十月(18) 九月(23) 八月(20) 七月(26) 六月(24) 五月(21) 四月(26) 三月(30) 二月(27) 一月(26) 2008 十二月(30) 十一月(31) 十月(31) 九月(29) 八月(31) 七月(31) 六月(30) 五月(30) 四月(31) 三月(31) 二月(29) 一月(33) 2007 十二月(31) 十一月(37) 十月(13) 文章分類 .Net (223) .NETCore (57) Accessibility (3) Angular (25) AngularJS (11) ASP.NET (223) ASP.NET5 (3) ASP.NETBlazor (1) ASP.NETCore (37) ASP.NETIdentity (2) ASP.NETMVC (105) ASP.NETWebAPI (13) AzureDevOps (33) C# (127) CloudComputing (4) CSS (29) DevOps (22) Docker (28) EntityFramework (23) Git (31) Golang (2) HTML5 (8) IIS (103) Java (26) JavaScript (108) Jenkins (7) Kubernetes (15) LINQ (36) Linux (114) MicroK8s (7) MicrosoftAzure (41) MySQL (15) Office (49) Office365 (28) Oracle (10) PHP (25) Scrum (1) Security (66) SQLServer (127) Subversion (35) SystemCenter (2) TFS (6) TFS2010 (10) Tips (190) UnitTesting (10) Usability (1) VBA (5) VisualBasic (5) VisualStudio (122) VisualStudio11 (2) VisualStudio2012 (10) VisualStudio2013 (4) VS2010Tips (23) Web (172) WebMatrix (8) Windows (45) Windows8 (14) WindowsAzure (18) WindowsPhone7 (14) 介紹好用工具 (228) 心得分享 (88) 多奇快訊 (9) 系統管理 (368) 前端工程研究 (20) 專案管理 (8) 團隊合作 (9) 網路管理 (22)



請為這篇文章評分?