文字與校稿
字數沒超過,表單卻不收?中文、英文與 Emoji 怎麼算
編輯器顯示沒超字數,表單卻不收?用兩行文字比較 17 個字元和 31 個 UTF-16 單位,說明中文、英文、Emoji、空白與換行怎麼算,以及交稿前該核對哪個數字。
先看收件規則,別挑最小的數字
編輯器顯示沒超字數,表單卻不收,先查收件方算的是什麼。要求英文單字數,就看英文單字;要求字元數,還要看空白、換行是否計入。我不會挑比較小的數字當答案,因為中文字、英文和 Emoji 可能用不同方式計算。兩邊數字不同,也不一定是哪個工具算錯。
如果說明只寫「二十字以內」,要問清楚標點和空白算不算、英文按字母還是單字算、換行是否佔額度。能試填的欄位,可以先用短句觀察提示。規則還是看不懂,而且會影響交件,就向收件方確認。
同一份原文,可以算出 17 或 31
先看下面這份自擬的兩行範例。原文不含引號,兩行中間只有一個換行,行末沒有多餘空白,最後也不另加換行。第二行的 é 是字母 e 加上組合重音符號,不是單一碼點的 é。
台灣 OpenAI 👨👩👧👦 A é 🇹🇼
把完全相同的原文交給本站統計程式,在支援字素簇分段的環境下,字元數是 17,不含空白字元數是 12。換成 Unicode 碼點算有 25 個,JavaScript 的字串 length 則是 31。下表也列出漢字和英文單字的結果,每一列算的東西不同,不能都叫作這份稿件唯一正確的總字數。
如果表單上限寫 20,看到本站顯示 17 就能交了嗎?還要看那個 20 的單位。假設上限是 20 個 UTF-16 單位,就得拿 31 去比較,這份原文超過了 11 個單位。只有上限按字素簇算、也包含空白時,17 才是能拿來比較的值。這裡的 20 是示範假設,不是任何特定平台目前的上限。
| 計數方式 | 結果 | 這個結果代表什麼 |
|---|---|---|
| 字素簇,含空白與換行 | 17 | 本站支援分段時的字元數。 |
| 字素簇,不含空白字元 | 12 | 排除四個空格及一個換行。 |
| Unicode 碼點 | 25 | 組合字形的各個碼點分開計算。 |
| UTF-16 單位 | 31 | JavaScript 字串 length。 |
| 漢字數 | 2 | 這份原文中的台、灣。 |
| 本站英文單字數 | 3 | OpenAI、A 與含重音的 e。 |
- 使用字數統計核對原文比較字元、漢字與英文單字欄位;目前使用的規則與限制也在工具頁說明。
一個 Emoji,為什麼會算成好幾個單位?
前面的「字素簇」,是把連在一起的字形當成一個分段單位,比較接近肉眼看到的一個字元。碼點則是 Unicode 用來辨認字元的編號。JavaScript 的字串 length 算的是 UTF-16 單位,有些碼點要用兩個單位表示,所以 length 不能直接當成肉眼看到的字數,也不代表交稿時一定要算兩字。
台灣旗幟 🇹🇼 是一個字素簇、兩個碼點、四個 UTF-16 單位。家庭 Emoji 👨👩👧👦 則是一個字素簇、七個碼點、十一個 UTF-16 單位。刪掉家庭 Emoji,畫面只少一個圖案,碼點和 UTF-16 單位卻少了許多。剩下還能輸入幾個字,光看畫面很容易估錯。
重音字母也一樣。單一碼點的 é,和字母 e 加上組合重音的 é,看起來接近,碼點數卻是 1 與 2;在這組範例中,字素簇數都是 1。從不同文件複製文字,外觀一樣不代表內部表示一樣。我會先查清楚這種差異,不為了少算幾個單位,就自行改動姓名、引文或識別碼。
本站在瀏覽器支援 Intl.Segmenter 時,按字素簇計算字元數;舊環境的相容模式改按碼點近似。不同裝置對 Emoji 的圖樣和組合支援可能不同,分段結果也取決於環境實作。看到工具顯示相容模式,遇到這類組合字形就要留意計數差異。原文仍可照樣保存,但比較上限時,不能直接沿用另一種模式的數字。
Unicode 提供文字編碼和分段規則,不會替每個平台決定投稿上限。有些欄位還會另外處理網址、標點或其他內容,仍要依該平台的說明判斷。
英文單字數,也有自己的算法
英文單字數不是字母數,也不一定只是按空格切開。本站會把字母間的部分連字號和撇號算進同一個單字。例如「don’t stop A-1」會得到三個英文單字:don’t、stop、A,數字 1 不算英文單字。這是本站目前的規則,不能直接當作所有出版或社群平台的規則。
前面兩行範例,若選本站「中英文字數」,會把2個漢字加上3個英文單字,得到5。這個5也有用途,但它不是整段可見字元數,Emoji沒有計入。對方要英文單字數,就看3;接受漢字加英文單字,才用5。若要求字元數,我會回頭確認空白是否計入,不拿這個較小的5去套上限。
改完再貼回表單,確認能送出
真的需要刪字時,先留一份原文,記下收件方規則,再用同一份文字統計。我會每改一次就重新算,不直接從總數扣掉肉眼估的字數,因為一個圖案可能佔好幾個單位。最後把成稿貼回交稿欄位,確認能送出,再保存最後版本。
如果兩邊仍對不上,回報時附一小段不含私人資料、能重現問題的原文,再寫下兩邊數值、是否含空白,以及瀏覽器是否使用相容模式。只給數字截圖,看不出是不是少了換行,或用了不同稿件。這些資料能幫忙查出差異,投稿資格與最終計數仍由收件方決定。
- 字數統計的交稿教學按照本站實際欄位設定目標,並核對統計結果。
參考來源
- Unicode:文字分段規則說明字素簇、單字與句子的分段,並容許依用途調整規則。
- MDN:JavaScript 字串長度說明 length 使用 UTF-16 單位,與碼點及字素簇數量可能不同。
- MDN:Intl.Segmenter說明字素簇分段的 API 用法及支援資訊。