-
Notifications
You must be signed in to change notification settings - Fork 97
台灣點字、英文、數字混排時的規則與實作
本文檔說明在處理「國字(注音)、英文、數字」混合內容時的點字轉換標準,以及小麥注音(McBopomofo)的實作邏輯。
第一部分:混合排版通則 (General Formatting Rules) 由於標準點字系統僅有 6 點(共 64 種變化),點字圖形在不同語境下會重複使用(例如:第一點 ⠁ 在注音是 ㄅ,在英文是 a,在數字是 1)。為了消除歧義,在不同類型的文字混合編排時,必須遵守嚴格的分隔與標示規則。
- 分隔原則:不同語種間必加空格 在一般書寫中,中英文或中數之間通常緊密排列或僅留半形空隙,但在點字規則中,必須強制插入**空格(Space)**作為區隔。
國字 ↔ 英文:必須加入一個空格。
國字 ↔ 數字:必須加入一個空格。
英文 ↔ 數字:通常視為不同語種,建議加入空格以利辨識(視具體文脈而定,本規範採強制分隔)。
範例:
一般文字:第1名
點字邏輯:[國字] + [空格] + [數字] + [空格] + [國字]
一般文字:Hi你好
點字邏輯:[英文] + [空格] + [國字]
- 標示原則:前置符號 為了讓讀者知道接下來的點字該對照哪一張表(英文表或數字表),必須使用前置修飾符號。
數字符號 (⠼):
當出現阿拉伯數字時,必須在數字序列的開頭加上此符號。
後續連續的數字不需要重複加符號。
若數字序列被空格中斷,再次出現數字時需重新加上符號。
大寫符號 (⠠):
當出現大寫英文字母時,必須在該字母前加上此符號。
每個大寫字母前都需單獨標示(除非使用雙大寫符號鎖定,本規範目前採單字標示)。
- 標點符號的歸屬 標點符號依據其「全形/半形」屬性,決定其不需分隔的語種:
全形標點(如 , 。):視同「國字」類別,與國字連接時不需加空格。
半形標點(如 , .):視同「英文/數字」類別,穿插在英文或數字中時不需加空格(如 3.14 或 a,b)。
第二部分:程式實作邏輯 (Implementation Logic) 為了精確執行上述排版規範,系統採用 有限狀態機 (Finite State Machine, FSM) 進行解析與轉換。
- 狀態機模型 轉換核心維護一個 state 變數,用來記錄當前處理的文字類型,共有四種狀態:
Initial (0):初始狀態,或剛輸出過空格(重置狀態)。
Bpmf (1):注音/國字模式(含全形標點)。
Digits (2):數字模式(含數字相關標點)。
Letters (3):英文模式(含半形標點)。
- 轉換邏輯:文字轉點字 (Text to Braille) 輸入一段混合文字字串,程式依序掃描字元:
自動插入空格(Auto-Spacing): 當讀取到的字元類型與 state 不同(且 state 不是 Initial)時,程式會先輸出一格空格,並將 state 重置為 Initial。這確保了第一部分提到的「分隔原則」。
狀態轉移與前綴輸出:
遇到數字:若當前非 Digits 狀態,輸出數字符號 ⠼,切換 state 至 Digits,再輸出數字點字。
遇到英文:若當前非 Letters 狀態,切換 state 至 Letters。若為大寫字母,先輸出大寫符號 ⠠,再輸出字母點字。
遇到注音/全形標點:切換 state 至 Bpmf,直接輸出對應點字。
- 轉換邏輯:點字轉回文字 (Braille to Text) 輸入一段點字字串,程式依序解析 Token:
前綴觸發狀態切換:
讀到 ⠼:鎖定進入 Digits 狀態。
讀到 ⠠ 或英文點字:鎖定進入 Letters 狀態。
讀到空格:若作為分隔符號使用,則消耗該空格並重置狀態至 Initial;若為有意義的空格則保留。
貪婪匹配 (Greedy Matching): 在未鎖定特定狀態(或 Initial 狀態)下,優先嘗試匹配注音符號(最長匹配原則,例如優先匹配 ㄓㄨㄤ 而非 ㄓ)。若匹配失敗,則嘗試解析為標點符號。