疑問是從資源頁自己的 FAQ 開始的
那份簡體 TXT 的詳情頁裡自己立了一個問題:「Q:千字文真的有一千個不重複的字嗎?」答案寫的是「傳統說法是約一千個不重複的字」,並註明「實際統計會因版本和用字標準不同而有差異」。這句自述就能量:「約一千」是幾個、「不重複」按什麼算。我把它取下來當被測文本,逐格讀回、逐行追差值。
資源頁給的是簡體整理本,所以本篇凡是引用被計數的字樣與詩句,一律留簡體原形並標成中文語料:那是量測對象,不是行文用字,轉成繁體就成了另一個字樣,帳要重對。
實測 4212 位元組、139 物理行、無 BOM、LF 行尾、末行帶換行;《千字文》的結構是 L1 標題行、L2 空行、L3 到 L127 正文 125 行、L128 空行、L129 到 L139 說明塊,正文 122 行是「四字+全形空格+四字」,另 3 行(L93、L102、L109)夾著範圍外的字。字數統計那頁只有一個 textarea 和八張統計卡,countText() 裡就八個運算式、零按鈕、零網路呼叫。
整檔跑一遍:八格各報什麼
整份檔案連標題行與說明塊一起貼進去讀回八格;再單獨跑 L3 到 L127 的正文切片。
| 格子 | 整檔 | 詩正文 |
|---|---|---|
| 總字元數 | 1528 | 1251 |
| 中文字數 | 1132 | 996 |
| 英文單詞數 | 8 | 0 |
| 數字個數 | 2 | 0 |
| 行數 | 140 | 125 |
| 段落數 | 3 | 1 |
| 空格數 | 4 | 0 |
| 去空格字元數 | 1260 | 1002 |
一千個不重字嗎:1000、996、995、991
125 行乘每行 8 字是 1000,可那只是排版帳;把用字範圍放寬逐字重數,正文真漢字實測恰 1000。頁面那條 [\u4e00-\u9fa5]([一-龥],U+4E00 到 U+9FA5)在同一份正文上只報 996,差 4。去重是第二筆帳:1000 去重剩 995,差的 5 恰是各出現 2 次的 5 種字——并(L79、L119)、发(L15、L21)、巨(L9、L82)、戚(L96、L105)、云(L7、L80)。這裡只報次數;這五種字在詩裡各佔兩處,是不是同一個繁化合併字位,得對照繁體底本才定,資源頁自述本版未做學術校勘。兩筆誤差還會疊:按頁面那條正則去重是 991。整檔口徑則是命中 1132、去重 1020,寬口徑 1136、去重 1024。
圖 1:四個數各屬一種問法
範圍外的 4 個字
漏抓清單只有 4 項,且都能定位:L109「弦歌酒䜩 接杯举觞」裡的 䜩 U+4729、L93「两䟽见机 解组谁逼」裡的 䟽 U+47FD,都在擴展 A(U+3400 到 4DBF);另兩個同在 L102,碼點 U+2CA0E 與 U+214DC,落在輔助平面,字形在本篇字元集裡寫不出來,只能給碼點。另外,L102 那行在總字元數裡按 11 計,典型詩句行是 9;整檔 total 報 1528、按碼點重數 1526,差的 2 就是這兩個字各多佔一格,正文口徑的 nospace 1002 比 1000 多出的也是這 2。本檔案沒有字落在 U+9FA6 到 U+9FFF 之間,所以是範圍沒覆蓋而非區間內漏數。
空格盲區:4 對 125
「空格數」的正則體裡是一個字面量空格,即 U+0020:整檔報的 4 個全在 L137 許可行,正文 125 行的貢獻是 0,隔開詩句的 125 個全形空格 U+3000 一個也不進這格。兩格互不相認:只餵兩個 U+3000,空格數報 0、去空格字元數也報 0,因為 nospace 的 \s 認它。整檔帳閉合:1528 減 1260 等於 268,等於 139 個換行加 125 個 U+3000 加 4 個半形空格。
圖 2:被減掉的 268 是三段拼的
行的帳與段的帳
lines 按換行切開數段:139 物理行報 140,末行帶換行就多出 1 個空段;同一段正文不帶末換行報 125,補一個換行立刻 126,一字未動。paras 先 trim 再按空行切:整檔報 3,三塊長度 5、1251、267 恰是標題行、正文、說明塊,中文字數 3 加 996 加 133 等於整檔的 1132;塊內全是單換行,湊不出 \n\s*\n,說明塊單獨跑 paras 只有 1。
英文單詞數 8 與數字個數 2 都來自文末
八個 token 是 https、zh、wikisource、org、wiki、CC、BY、SA,落在 L136 的網址與 L137 的許可行;num 是把「4.0」用 \d+ 拆成 4 和 0。「CC BY-SA 4.0」單獨餵進去實測 12 個字元、en 3、num 2、空格 2。詩正文那 125 行的 en 與 num 全 0,這兩格報的與詩本身無關。
逐行求和與整檔一次:五條相等,三條失真
按行拆開逐段餵、再對八格求和,與整檔一次對照:total 求和 1389 對 1528,少 139——換行被切走,不再屬於任何一段;lines 是 137 對 140;paras 是 137 對 3,逐段時每段自成一段落,虛增 134。而 1132、8、2、4、1260 這五個欄位兩種演算法完全相等,因為命中從不跨行。
放大 1000 倍跑三次
整份複製 1000 次是 4212000 位元組,countText 完整跑 3 次耗時 134.4374、75.1041、75.9508 毫秒,首次含熱身,後兩次穩在 75;拆開計時,漢字正則單獨 59.5327 毫秒、去空格替換單獨 7.0938 毫秒。大文字量八格照舊報全,行數 139001、段落數 2001;原整檔單跑只有 0.1291 毫秒。這些都是 Node 側對逐字摘出的函式計的時,瀏覽器端重新整理耗時與 textarea 的行數上限行為都未實測。
頁面文案與八個運算式
介紹文案與小貼士逐條對程式碼判:11 條判定,3 條一致、3 條衝突、5 條部分一致。衝突三條正壓在靶子上——「中文字數:精確統計中文漢字數量」對本檔案漏 4 個真漢字,真值 1000 對頁面 996;「數字個數:統計文字中的數字字元數」數的是連續串,「4.0」報 2;介紹清單裡的「標點符號」在八個欄位裡根本沒有對應格子。「英文單詞按空格分詞」也名不符實:abc123def 報 0、don't 報 2。
FAQ
Q:這份《千字文》到底有多少字?
看口徑:整檔 1528 與 1132;正文切片 1251 與 996;放寬範圍重數 1000、去重 995;頁面口徑去重 991。「約一千」這句要靠這四個數一起解釋。
Q:空格數為什麼只有 4,詩行裡明明有 125 個空格?
半形那 4 個全在文末許可行;詩行之間的是全形空格 U+3000,只認 U+0020 的正則數不到,而 nospace 的 \s 反倒把這 125 個連同 139 個換行一起減掉。
Q:并、发、巨、戚、云 算重字嗎?要不要排個榜?
在這份正文裡它們各出現 2 次,去重因此是 995 而不是 1000;本篇只交代次數,不排榜,也不做繁簡歸併的斷言。字數一般怎麼數另有舊文 論文、文案字數怎麼數。