cat 与使用 WinSCP 查看和执行从 Windows 上传到 Linux 的包含变音符号的文件

cat 与使用 WinSCP 查看和执行从 Windows 上传到 Linux 的包含变音符号的文件

我有一个DE_CopyOldToNew.sh在 Windows 中创建的文件。然后使用 WinSCP 将文件上传到 Linux。该文件包含一大堆 cp 命令,这些命令将文件复制到新文件夹,并分配新文件名。这些命令包含带有变音符号(例如 Gewährleistungsbürgschaft.当我执行 a 时,cat DE_CopyOldToNew.sh我注意到变音符号以“损坏”的方式显示,例如Gew▒hrleistungsb▒rgschaft。当我执行 aview DE_CopyOldToNew.sh时,变音符号会按应有的方式显示,例如Gewährleistungsbürgschaft。当我执行脚本时,出现cp: cannot stat错误,文件夹和文件中的变音符号显示为Gew\344hrleistungsb\374rgschaft.我已经使用binary以及上传了文件,text并且还执行了dos2unix DE_CopyOldToNew.sh.当我在 Windows 中复制脚本内容并将其粘贴到 Linux 中的新文件中时,我就可以毫无问题地运行新脚本。是什么导致上传的版本“损坏”(因为缺乏更好的词)?

答案1

您的文件是以 ISO-8859 编码之一(可能是 Windows CP1252 或 ISO-8859-15)编写的,而您的基于 Linux 的系统设置为期望 UTF-8 编码。

您可以很容易地验证这一点:

# Original text
printf 'Gew\344hrleistungsb\374rgschaft\n'
Gew�hrleistungsb�rgschaft

# What character set
printf 'Gew\344hrleistungsb\374rgschaft\n' | file -
/dev/stdin: ISO-8859 text

# Transcoded text
printf 'Gew\344hrleistungsb\374rgschaft\n' | iconv -f iso-8859-15 -t utf-8
Gewährleistungsbürgschaft

# What character set
printf 'Gew\344hrleistungsb\374rgschaft\n' | iconv -f iso-8859-15 -t utf-8 | file -
/dev/stdin: UTF-8 Unicode text

解决方案?

  1. 在源系统上将文件创建为 UTF-8(Windows 应用程序支持此字符集)

  2. 将基于 Linux 的系统降级回 ISO-8859。不推荐(但可能)

  3. 传输后转换文件:

    iconv -f iso-8859-15 -t utf-8 DE_CopyOldToNew.sh >DE_CopyOldToNew.sh.tmp &&
        mv -f DE_CopyOldToNew.sh.tmp DE_CopyOldToNew.sh
    

相关内容