如何修复在子目录中看起来不太好的 UTF-8 字符编码文件名

Geo*_*rge 2 character-encoding

我的文件名类似于K\xc3\x83\xc2\xa4ytt\xc3\x83\xc2\xb6ohje.pdf. 这应该是K\xc3\xa4ytt\xc3\xb6ohje.pdf

\n

我可以使用以下命令转换子目录中的所有文件:

\n
convmv -f utf8 -t iso-8859-1 -r --notest *\n
Run Code Online (Sandbox Code Playgroud)\n

这将转换K\xc3\x83\xc2\xa4ytt\xc3\x83\xc2\xb6ohje.pdfK\xc3\xa4ytt\xc3\xb6ohje.pdf.

\n

问题是文件是否已经是表单K\xc3\xa4ytt\xc3\xb6ohje.pdf

\n

文件K\xc3\xa4ytt\xc3\xb6ohje.pdf转换为K'$'\\344''ytt'$'\\366''ohje.pdf

\n

如何更改上面的命令以便

\n
    \n
  • K\xc3\xa4ytt\xc3\xb6ohje.pdf被转换为K\xc3\xa4ytt\xc3\xb6ohje.pdf(单独留下)并且
  • \n
  • K\xc3\x83\xc2\xa4ytt\xc3\x83\xc2\xb6ohje.pdf仍然转换为K\xc3\xa4ytt\xc3\xb6ohje.pdf
  • \n
\n

Sté*_*las 5

您的错误文件似乎是双 UTF-8 编码的。

\n

例如,\xc3\xa4U+00E4 被编码为:

\n
    \n
  1. U+00E4 -> 0xc3 0xa4(UTF-8 编码)
  2. \n
  3. 0xc3 -> 0xc3 0x83 (iso8859-1 \xc3\x83-> UTF-8), 0xa4 -> 0xc3 0xa4 (iso8859-1 \xc2\xa4-> UTF-8) 其中 U+00E4 的 UTF-8 编码的每个字节都被解释为好像它们是单字节字符集中其他字符的编码(这里可能是 iso8859-1 或 windows-1252)并再次以 UTF-8 进行编码。
  4. \n
\n

convmv -f utf8 -t iso-8859-1所以你用它是正确的。要保留未双重编码的文件,convmv有一个特殊选项:--fixdouble,所以它应该是:

\n
convmv --fixdouble -f utf8 -t iso-8859-1 -r --notest .\n
Run Code Online (Sandbox Code Playgroud)\n

convmv手册中有专门的部分:

\n
\n

如何撤消双 UTF-8(或其他)编码文件名

\n

有时,您可能会对某些文件名进行“双重编码”,例如文件名已经是 UTF-8 编码,而您\n不小心又进行了从某些字符集到 UTF-8 的转换。您可以通过相反的方式简单地撤消该操作。源字符集必须是 UTF-8,目标字符集必须是您之前意外使用的源字符集。如果您使用\n“--fixdouble”选项 convmv 将确保仅处理转换后仍为 UTF-8 编码的文件,并且\n将保持非 UTF-8 文件不变。您应该通过之前不带“--notest”的转换来检查是否获得正确的结果,\n“--qfrom”选项也可能会有所帮助,因为如果双 utf-8 文件名被使用,它们可能会搞砸您的终端。打印 -\n它们通常包含控制序列,可以在终端窗口中执行有趣的操作。如果您不确定意外转换的字符集,使用“--qfrom”是一个好方法,可以在不破坏文件名的情况下找出所需的编码。

\n
\n

通过 iso8859-1(涵盖代码点 U+0000 U+00FF)进行双 UTF 编码的文件将包含由 U+00C2 -> U+00F4 范围内的一个字符组成的非 ASCII 字符序列 ( \xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4)后跟 U+0080 -> U+00BF 范围内的一个或多个字符(U+0080 到 U+009F 是控制字符加不间断空格加\xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf)。这些序列相对不太可能出现在非双编码文本中,特别是考虑到 U+00E0 以上的字符(上面第一组中的小写字符)后面必须跟有第二组中的至少 2 个字符,convmv --fixdouble因此不太可能弄错。

\n