Character-Encoding

如何修復在子目錄中看起來不太好的 UTF-8 字元編碼文件名

  • January 11, 2022

我有像Käyttöohje.pdf. 這應該是Käyttöohje.pdf

我可以使用以下命令轉換子目錄中的所有文件:

convmv -f utf8 -t iso-8859-1 -r --notest *

這轉換Käyttöohje.pdfKäyttöohje.pdf.

問題是文件是否已經存在Käyttöohje.pdf

文件Käyttöohje.pdf轉換為K'$'\344''ytt'$'\366''ohje.pdf

如何更改上述命令,以便

  • Käyttöohje.pdf被轉換為Käyttöohje.pdf(單獨留下)和
  • Käyttöohje.pdf仍然轉換為Käyttöohje.pdf

您不正確的文件似乎是雙 UTF-8 編碼。

例如,äU+00E4 已被編碼為:

  1. U+00E4 -> 0xc3 0xa4(UTF-8 編碼)
  2. 0xc3 -> 0xc3 0x83 (iso8859-1 Ã-> UTF-8), 0xa4 -> 0xc3 0xa4 (iso8859-1 ¤-> UTF-8) 其中 U+00E4 的 UTF-8 編碼的每個字節都被解釋為是在單字節字元集(這裡可能是 iso8859-1 或 windows-1252)中對某些其他字元進行編碼,並在 UTF-8 中再次編碼。

所以你使用它是正確convmv -f utf8 -t iso-8859-1的。要單獨保留未雙重編碼的文件,convmv有一個特殊選項:--fixdouble,所以它應該是:

convmv --fixdouble -f utf8 -t iso-8859-1 -r --notest .

convmv手冊中有專門的部分:

如何撤消雙 UTF-8(或其他)編碼文件名

有時您可能會“雙重編碼”某些文件名,例如文件名已經是 UTF-8 編碼,而您不小心將某些字元集轉換為 UTF-8。您可以通過相反的方式簡單地撤消它。from-charset 必須是 UTF-8,to-charset 必須是您之前不小心使用的 from-charset。如果您使用“–fixdouble”選項,convmv 將確保僅處理轉換後仍為 UTF-8 編碼的文件,並且不會觸及非 UTF-8 文件。您應該通過在沒有“–notest”之前進行轉換來檢查以獲得正確的結果,“–qfrom”選項可能會有所幫助,因為如果列印雙 utf-8 文件名可能會搞砸您的終端 - 它們通常包含控制序列,這些控制序列會在您的終端視窗中做一些有趣的事情。如果您不確定意外轉換的字元集,使用“–qfrom”是一種在不破壞文件名的情況下整理所需編碼的好方法。

通過 iso8859-1 進行雙 UTF 編碼的文件(涵蓋程式碼點 U+0000 U+00FF)將包含由 U+00C2 -> U+00F4 範圍內的一個字元組成的非 ASCII 字元序列 ( ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóô)後跟一個或多個 U+0080 -> U+00BF 範圍內的字元(U+0080 到 U+009F 是控製字元加不間斷空格加¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿)。這些序列相對不太可能出現在非雙編碼文本中,特別是考慮到 U+00E0 以上的字元(上面第一組中的小寫字元)必須跟在第二組中至少 2 個字元之後,所以convmv --fixdouble是不太可能弄錯。

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