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

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

我的文件名类似于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

答案1

您的错误文件似乎是双 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 的转换。您可以通过相反的方式简单地撤消该操作。源字符集必须是 UTF-8,目标字符集必须是您之前意外使用的源字符集。如果您使用“--fixdouble”选项 convmv 将确保仅处理转换后仍为 UTF-8 编码的文件,并且不会影响非 UTF-8 文件。您应该通过之前不使用“--notest”进行转换来检查是否获得正确的结果,“--qfrom”选项也可能会有所帮助,因为如果打印双 utf-8 文件名,它们可能会搞砸您的终端- 它们通常包含控制序列,可以在终端窗口中执行有趣的操作。如果您不确定意外转换的字符集,使用“--qfrom”是一个好方法,可以在不破坏文件名的情况下找出所需的编码。

通过 iso8859-1(涵盖代码点 U+0000 U+00FF)进行双 UTF 编码的文件将包含由 U+00C2 -> U+00F4 范围内的一个字符组成的非 ASCII 字符序列 ( ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóô)后跟 U+0080 -> U+00BF 范围内的一个或多个字符(U+0080 到 U+009F 是控制字符加不间断空格加¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿)。这些序列相对不太可能出现在非双编码文本中,特别是考虑到 U+00E0 以上的字符(上面第一组中的小写字符)后面必须跟有第二组中的至少 2 个字符,convmv --fixdouble因此不太可能弄错。

相关内容