# 電腦台語字有偌長? 以下有三條台語工程師面試模擬考題(?),逐家先寫看覓: 請寫出以下三逝 JavaScript 程式碼的輸出結果 ```javascript console.log("𠕇".length) console.log("ê".length) console.log("n̂g".length) ``` 請寫出以下三逝 Python3 程式碼的輸出結果 ```Python3 print(len("𠕇")) print(len("ê")) print(len("n̂g")) ``` 請寫出以下三逝 Excel 函數的輸出結果 ```excel =len("𠕇") =len("ê") =len("n̂g") ``` ## 參考答案 - JavaScript 程式碼的輸出結果是: 2 1 3 - Python3 程式碼的輸出結果是:1 1 3 - Excel 函數的輸出結果是:2 1 3 ## 題目解說:羅馬字部份 咱先講羅馬字,羅馬字的部份較簡單,三个無仝環境的表現嘛仝款,"ê"算是 1 个字元,"n̂g"算是 3 个字元 ### Unicode 處理羅馬字的兩種機制 Unicode 咧處理有調符的羅馬字的時陣,有兩種編碼的方式: 用一个編碼表示:像 `ê` 就是 U+00EA 用羅馬字符號加上組合附加符號編碼表示:像 `n̂` 就是 `U+006E` 加上 `U+0302`,頭前的 `U+006E` 就是 `n` 的編碼,後壁的 `U+0302` 就是臺羅第五調符號的編碼,正式名是 `COMBINING CIRCUMFLEX ACCENT` ### 用獨立編碼抑是組合符號的歷史原由 是按怎 `ê` 用已經組好的編碼,`n̂` 煞愛用兩个符號表示咧?因為 Unicode 頭起先咧制定的時陣會相容原本世界各國固有的編碼系統,有真濟符號就有收錄這種已經組好的編碼,毋過若是無收錄著的,Unicode 委員會的基本態度就是用組合符號表示,袂閣增加新的已經組好的編碼。 強勢語言嘛有用著的符號就會有收錄著,像「café」的 「é」佮臺羅第二調母音 `é` 是仝一个符號,這就有收,毋過像台語的第八調的符號、有調符 `m`、`ng` 佮白話字的 `o͘` 就無獨立編碼,一定愛用組合的。 就按呢,`ê` 佇資訊處理的層次是當做「一个字元」,n̂g 煞是「三个字元」 ### 是按怎臺羅調符定定會歪-\-去? 用組合符號表示的羅馬字就愛字型設定有去好好仔定義彼个調符應該愛生佇啥物所在生啥物形,針對台語羅馬字的外型多數字型無去設定,所以咱毋才會定定看著歪去的第八調羅馬字。 ## 題目解說:漢字部份 ### Unicode 捌空思夢想 16 位元編世界所有文字編碼 閣來講漢字的部份,Unicode 佇 1.0 的時代猶有一个後來放棄的夢想,就是想欲「用 16 个位元表示全世界所有的文字」 16 位元的組合干焦對 `U+0000` 編甲 `U+FFFF`,干焦 2^16 = 65536 个符號,後來當然是放棄矣(主要是予漢字拍敗😂,漢字數量傷濟矣)佇 Unicode 2.0 就放棄這个夢想,增加「補充平面機制」,抑就是編碼範圍會當超過 `U+0FFFF`,照講會當一直編甲 `U+FFFFF`,會當編百萬幾字 ### UTF-16 佮代理對規則 UTF-16 就是用 16 个位元編碼字元的型式,嘛是多數程式語言處理字元的規則(C++、Python2、Javascript 攏是 UTF-16),Unicode 2.0 放棄 16 位元編碼全世界文字的空思夢想了後,就定義所謂的「代理對(surrogate pairs)」機制,共 `U+D800` 到 `U+DFFF` 的編碼用來當做「代理對」編碼,編碼超出 `U+0FFFF` 的符號就用==兩个==代理對編碼表示,遮無欲詳細講轉換的規則,若是有興趣會當去掀後壁的參考資料。 ### 台語漢字 `𠕇` 的情形 簡單講,編碼超出 `U+0FFFF` 的符號佇 UTF-16 的環境之下會用==兩个==符號表示,像`𠕇` 的編碼是 `U+20547`,佇 UTF-16 愛轉做代理對 `0xD841` 加上 `0xDD47`。 頭前題目的 Javascript 佮 Excel(C++) 攏是 UTF-16 的環境,所以會共 `𠕇` 轉做代理對,嘛會共看做是==兩个==字元。啊若 Python3 是 UTF-32,就直接是一个字元表示 ### 超出 BMP 範圍的台語漢字 16 位元範圍內的`U+0000` 到 `U+FFFF` 範圍的字叫做 「Basic Multilingual Plane」,簡稱 BMP,華譯是*基本多文種平面*,台語有一寡超出 BMP 範圍的漢字,詳細會當看再會豆腐字 [本土語言外字表](https://docs.google.com/spreadsheets/d/1RPN_4sVAYlHaMchak1wwf2dpNKRcLil7WFHkB1ZGVuE/edit?gid=1018353923#gid=1018353923),佇「𠕇」後壁 Unicode 區段寫五碼个漢字攏是超出 BMP 範圍的台語漢字,攏總有 57 个,遮的漢字嘛定定是電腦字型會欠字的字。 ![image](https://hackmd.io/_uploads/S1YumeynC.png) ## 補充:閣較複雜的 e-móo-jih e-móo-jih 多數的符號攏佇 BMP 範圍以外,所以若是 UTF-16 的環境嘛需要代理對,像`😻` 的編碼是 `U+1F63B`,UTF-16 愛轉做代理對 `0xD83D` 佮 `0xDE3B` e-móo-jih 閣有一寡真有進步價值的設計,像同性戀家庭`👨‍👨‍👦` 的符號愛透過以下的配方合成: - 兩个阿爸佮一个查埔囡仔`👨👨👦`,也就是`U+1F468` `U+1F468` `U+1F466` - 三个符號中央閣加上代表連字的 ZERO WIDTH JOINER`U+200D`,攏總有五个符號 - `U+1F468` `U+200D` `U+1F468` `U+200D` `U+1F466` 才通組出`👨‍👨‍👦` 像一个例,佇 UTF-32 環境是==五个==符號,佇 UTF-16 環境就會變做==八个==符號🤪 ### e-móo-jih 佮台語文資訊處理環境的故事 濟濟國際上以早用 UTF-16 起的一寡網路討論區抑是程式其實無處理代理對的機制,就算 Unicode 2.0 定義新的功能,編碼較後壁的符號就 in 來講嘛無啥用會著,毋過後來 e-móo-jih 足衝足衝,全世界的工程師攏開始咧研究「欲按怎予我的系統拍會出 e-móo-jih」,推動一波 emoji 革命,這嘛順紲予遮的程式通好處理台語漢字。 ## 延伸閱讀 - [Unicode 歷史 - 字嗨](https://zi-hi.com/Unicode) - [UTF-16 - 字嗨](https://zi-hi.com/UTF-16) - [Emoji Modifier Sequence](https://emojipedia.org/emoji-modifier-sequence#grid) - [本土語言外字表](https://docs.google.com/spreadsheets/d/1RPN_4sVAYlHaMchak1wwf2dpNKRcLil7WFHkB1ZGVuE/edit?gid=1018353923#gid=1018353923)