我在 macOS 中,使用 Finder 透過 SMB 嘗試存取共用資料夾中的檔案時,有時會收到錯誤代碼 -43。是什麼原因造成的呢?
在上方的螢幕擷取畫面中,Finder 會嘗試 (透過 SMB) 存取共用資料夾中的 "1_ã" 目錄並建立子資料夾,而導致錯誤。這是因為 "ã" 字元在進行編碼時,所使用的是正規化格式 D (Normalization Form D, NFD),也就是所謂的「正準分解 (Canonical Decomposition)」Unicode 正規化格式。
然而,Finder 在用戶端傳送要求時,所使用的是正規化格式 C (NFC),也就是所謂的「正準合成 (Canonical Composition)」格式。因此 NAS 伺服器無法辨識目錄名稱,也找不到目錄,所以伺服器會回報錯誤。
這項差異也導致了資料夾中,檔名包含 NFD 格式字母的部分檔案,變得無法顯示且無法編輯。在這類資料夾中,重新命名檔案、建立檔案、編輯檔案等作業可能會失敗。
因為伺服器與用戶端使用了兩種不同的 Unicode 正規化格式,而導致這項錯誤發生。當使用者嘗試透過 SMB 存取 NAS 伺服器上的共用資料夾時,用戶端會傳送要求來探索目錄中有哪些檔案。NAS 伺服器收到要求時,會傳送目錄中所有的檔名給用戶端。若雙方的檔名使用了不同的 Unicode 正規化格式 (在此案例中伺服器使用了 NFD,而用戶端使用了 NFC),就會發生問題。若用戶端將檔案儲存到 NAS 伺服器時,選擇了不同的格式,就會發生這種問題。用戶端收到檔名時,會要求伺服器顯示這些檔案,或要求在目錄中建立新檔案。要求的編碼格式取決於用戶端的設定。若用戶端所使用的要求格式與伺服器端的格式有所不同,伺服器就找不到檔案或目錄,而回報錯誤。
不過,若想要針對儲存在 NAS 中的檔案,將 NFD 格式的檔名轉換成 NFC 格式,可以使用名為 convmv 的工具。請遵循下方的步驟,安裝 convmv。
- 登入 NAS 並前往 App Center。
- 安裝 Perl。

- 前往https://www.j3e.de/linux/convmv/ 並下載 convmv。
- 將檔案儲存到 NAS 上的目錄中 (例如共用資料夾「Public」)。
- 開啟終端機並建立 SSH 連線,以登入 NAS。
- 輸入存放 convmv 的資料夾路徑。
輸入指令:Run: cd /share/Public - 將檔案解壓縮。
輸入指令:Run: tar -xvf convmv-2.05.tar.gz - 進入存放解壓縮檔案的資料夾路徑。
輸入指令:Run: cd convmv-2.05 - 確定 convmv 可以執行。
輸入指令:Run: chmod a+x convmv - 修改 NAS 的 Perl shell 路徑。
輸入指令:Run: sed -i -e'1c\\#\!\/opt\/bin\/perl' convmv - 轉換檔名。
輸入指令:Run: ./convmv -r --nfc --nosmart -f UTF-8 -t UTF-8 --notest <包含待轉換檔案的資料夾路徑>
注意:
以上指示是針對平台為 x86_64 的 QTS 4.3.6 韌體。若使用先前的韌體版本來嘗試以上步驟,結果可能會有所不同。例如,步驟 10 中的 Perl shell 路徑可能會有所差異,因此可能會需要將其改成正確的路徑。
以上指示不適用於 ARM 架構的機種。
參考資料:
https://en.wikipedia.org/wiki/Unicode_equivalence#Errors_due_to_normalization_differences
https://en.wikipedia.org/wiki/Unicode_equivalence#Normalization
https://www.j3e.de/linux/convmv/
https://linux.die.net/man/1/convmv
http://unicode.org/reports/tr15