前言
- 記得以前在調整「期貨交易網路文章推薦」這篇的格式與贅字,發現有不少重複的字,這可能是由於 pdf 或各種原始來源轉檔後的問題。
- 近期發現這些贅字有漏網之魚,之前沒有修正到,簡單紀錄查找與取代的過程。
說明
發現編碼不同
每隔一小段時間我就會重讀一次這些網路文章,剛好看到之前沒改到的漏網之魚:

vscode 中用 ⌘ + F
搜尋 用
,結果根本沒搜到重複的兩個字。
特別貼了左邊的「用
」,
結果一細查發現左邊的字是部首、右邊的字是一般文字!差別在於 unicode 編碼不同;例如:
- 「⽤」
U+2f64
、「用」U+7528
。 - 「⼀」
U+2f00
、「一」U+4e00
。
這是這次修改的部分內容:
全部改成 「用
」 (U+7528
) 就沒問題了。
編碼調查指令
再進一步查找之前,我們可以紀錄一個指令,方便我們在 terminal 對照編碼 (source [4]) :
純 bash
|
|
Note
- 注意
"'$1"
裡面的單引號'
只有一個,這是告訴 bash 把後面的文字照字面上的意思傳入printf
中。
或者 python 版
|
|
一口氣查找
根據 wiki [1] 中一路查到兩個 pdf 文件 [2][3],於是在 vscode 中用 regex (正規表達式) 一次查找所有的部首:
[\u2E80-\u2EFF] # CJK Radicals Supplement
[\u2F00-\u2FDF] # Kangxi Radicals
一搜下去,發現還有大約 20 個字要修改!
像是
|
|
如果你只有找到幾個字,一個個找到編碼用 regex 字串取代就可以了。
例如說上面的「西
」(U+2ec4
) 要換成「西
」(U+897f
),
但是既然我有 20 個字要改,那就只好批次處理了!
起手式 grep
先找 2f
開頭的
|
|
還有 2e
開頭
|
|
Note
- 因為我們用
grep -P
來使用 Perl 兼容的正規表達式,他不支援\u
的寫法,所以要改成使用\x{????}
而不是\u????
。 - 根據前面提到的這兩個 pdf 文件 [2][3],只要是
2f
或是2e
開頭的,就代表他是部首,而不是普通的字。
一口氣取代
把整串結果貼到正規化工具中,例如我找到這個 [5],從 Unicode NFKC
選項中可以拿到轉換後的文字。
現在我們有:
|
|
然後可以用一個 loop 重複 call sed
來取代全部的字元:
|
|
取代的概念會像是這樣:
|
|
大功告成!
也許你會想,如果都能直接從線上工具取得正規化 (normalization) 後的字串,那我把整篇文章貼上去不就好了?
技術上可以,我沒有這樣做的原因是
- 他會把我習慣的全形標點符號全部轉換成半形
- 順便練習寫個簡單的 bash script
如果你可以接受「標點符號先被轉換過、自己再去處理一輪標點符號」的話,也可以不用 script 處理。
補充
文章內的字元
如果你在這篇文章中直接搜尋對應的文字,例如「用
」,會匹配所有的結果,這是因為預設情況下為了避免麻煩,本站的打包工具已經自動正規化 (normalization)。
例如在第一節中,最後一段我的原始文字是這樣的:
|
|
在打包之後,工具已經將所有常見的部首轉換成一般文字;
技術上來說是
- 將「中日韓部首」(CJK Radicals) ,包含康熙部首 (Kangxi radicals)、以及「中日韓部首補充」(CJK Radicals Supplement)
- 轉為「中日韓統一表意文字」(CJK Unified Ideograph)
Unicode 前綴
目前註記 Unicode 字元已經出現三種常見寫法,
在不同情境中會有不同的用途與顯示方式:
前綴 | 範例 | 用途 |
---|---|---|
U+ |
U+7528 |
註記是 Unicode 字元,給人類閱讀用,常見於 Unicode 文件或討論中 |
\u |
\u7528 |
程式中用來表示 Unicode 字元,常見於 regex、JavaScript、JSON 等 |
0x |
0x7528 |
用 16 進位表示的整數(code point 整數值),常用於底層程式或資料格式中 |