Filenames

文件路徑可以是無效的 UTF-8 嗎?

  • September 6, 2021

標題說明了一切:如果我有文件路徑的字節並且我嘗試將它們解碼為 UTF-8,操作是否可能會失敗(即有效的 unix 文件路徑的字節可能是無效的 UTF-8)?

是的,完美。本機 Linux 文件系統的文件路徑/名稱可以包含除NULL和之外的任何二進制數據/

touch "$(dd if=/dev/urandom bs=128 count=1)"

會帶你到那裡。該命令可能會失敗,因為它不會清理任何東西 - 您可能需要多次執行它才能獲得良好的效果。

除了 Artem S. Tashkinov 的回答:

偶然發現文件名中無效的 UTF-8 序列的一個常見原因是:它們是在不同的語言環境設置下創建的。是的:發現仍在使用 ISO-8859 字元集編碼執行的系統並不罕見。更不用說世界各地的 PC 和 MAC 上使用的無數不同的字元集……

以下範例顯示了同一目錄中具有相同名稱Überraschung(德語為驚奇)的兩個文件。一個文件是用 創建的LANG=en_us.UTF-8,另一個是用LANG=en_US.ISO-8859-15:

使用 UTF-8 編碼列出時:

   $ ls -lt
   total 0
   -rw-r--r-- 1 ktf ktf 0 Sep  6 12:01 ''$'\334''berraschung'
   -rw-r--r-- 1 ktf ktf 0 Sep  6 12:00  Überraschung

當使用 ISO-8859-15 編碼列出時:

   $ ls -lt
   total 0
   -rw-r--r-- 1 ktf ktf 0 Sep  6 12:01  Überraschung
   -rw-r--r-- 1 ktf ktf 0 Sep  6 12:00 'Ã'$'\234''berraschung'

提示:要在字元集之間正確切換,您必須更改以下兩個設置:

  1. LANGUNIX/Linux shell中環境變數的設置。它控制 UNIX 系統如何解釋和處理字元。
  2. 終端仿真的字元編碼(例如gnome-termputty)。這控制了字元在螢幕上的顯示方式。

引用自:https://unix.stackexchange.com/questions/667652