![cat 与使用 WinSCP 查看和执行从 Windows 上传到 Linux 的包含变音符号的文件](https://linux22.com/image/229789/cat%20%E4%B8%8E%E4%BD%BF%E7%94%A8%20WinSCP%20%E6%9F%A5%E7%9C%8B%E5%92%8C%E6%89%A7%E8%A1%8C%E4%BB%8E%20Windows%20%E4%B8%8A%E4%BC%A0%E5%88%B0%20Linux%20%E7%9A%84%E5%8C%85%E5%90%AB%E5%8F%98%E9%9F%B3%E7%AC%A6%E5%8F%B7%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个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
解决方案?
在源系统上将文件创建为 UTF-8(Windows 应用程序支持此字符集)
将基于 Linux 的系统降级回 ISO-8859。不推荐(但可能)
传输后转换文件:
iconv -f iso-8859-15 -t utf-8 DE_CopyOldToNew.sh >DE_CopyOldToNew.sh.tmp && mv -f DE_CopyOldToNew.sh.tmp DE_CopyOldToNew.sh