我有一个文件
СМП бваг™вга†
前三个字母是正确的西尔字母,其余部分是莫吉巴克字母。
“ Mojibake是使用非预期的字符编码对文本进行解码而产生的乱码或胡言乱语的文本。” — 维基百科
最初是
СМП структура
但后来不知怎么的就变成了乱码,很可能是因为该文件是由一个不熟练的用户在 Windows XP 上压缩的,然后在 Mac 上解压的。
convmv
我尝试使用和修复它iconv
,如下所示:
convmv -r -f cp1251 -t utf-8 DIR
ls | iconv -f cp1251 -t cp850 | iconv -f cp866
但尚未成功。有人能帮忙吗?
更新 1
十六进制转储СМП бваг™вга†
:
0000000 d0 a1 d0 9c d0 9f 20 d0 b1 d0 b2 d0 b0 d0 b3 e2
С ** М ** П ** б ** в ** а ** г ** ™
0000020 84 a2 d0 b2 d0 b3 d0 b0 e2 80 a0 0a
** ** в ** г ** а ** † ** ** \n
0000034
十六进制转储СМП структура
:
0000000 d0 a1 d0 9c d0 9f 20 d1 81 d1 82 d1 80 d1 83 d0
С ** М ** П ** с ** т ** р ** у ** к
0000020 ba d1 82 d1 83 d1 80 d0 b0 0a
** т ** у ** р ** а ** \n
0000032
这些文件名看起来像是最初用CP866编码的,但被错误地转换为 UTF-8,因为以为它们是用MAC-CYRILLIC编码的。
要修复此问题,请恢复该过程:
在 macOS 以外的系统上,
應該做。
但是 macos 不能使用任意字节值的文件名,似乎它的 API 期望文件名是有效的 UTF-8 编码文本,并且它
rename()
会拒绝EILSEQ
错误(非法字节序列)尝试将文件重命名为非 UTF-8 编码的文件名(例如第一个convmv
所做的那样)。因此,我们需要一次性完成这两个步骤,才能直接从 UTF-8 转换为 UTF-8。
可能是这样的:
(这里假设
rename
来自 perlFile::Rename
模块并使用它NFC
来解决另一个 macos 特性,即通过将文件名中的某些字符转换为其分解形式来破坏它们,内部也会自动进行某些convmv
操作)。如果满意的话,删除
-n
(试运行)。