我对 WinSCP 搞乱换行的方式感到非常厌烦。
this is line 1
this is line 2
变成
this is line 1
this is line 2
我可以使用 FileZilla 进行 FTP,使用 Putty 进行 SCP(我认为 Putty 可以处理),但这很烦人。我该如何缓解这个问题?
答案1
我想说的是acidzombie24是最好的建议。就我个人而言,我还没有遇到过比 WinSCP 更好的 FTP 程序。我建议您将设置更改为使用二进制进行传输,并使用 NP++ 之类的编辑器,而不是内部编辑器。
以下是一些截图:
答案2
WinSCP FAQ 的修订版本为什么文件传输或编辑后文本文件换行错误?
特别参见已知的问题部分。
在传输或者编辑文件后,可能会出现换行错误的情况,表现为:
- 换行符丢失。看起来好像整个文件内容都在一行上。
- 换行重复。好像每行之间都有额外的空行。
- 每行末尾都有奇怪的符号/字符。
文本文件格式
不同的平台(操作系统)使用不同的文本文件格式。最常见的格式是 Unix 和 Windows 格式。主要区别在于使用不同的字符或字符序列来表示行尾。在 Unix 上,它是 LF 字符(\n
,0A
或十进制的 10)。在 Windows 上,它是两个字符的序列,CR 和 LF(\r
+ \n
,0D
+0A
或十进制的 13 + 10)。
虽然如今许多应用程序和系统都可以处理这两种格式,但有些应用程序和系统需要特定的格式。当以另一种格式呈现文件时,它们无法正确显示,如上所述。
文本/ASCII 传输模式
因此,文件传输客户端和服务器支持文本/ASCII传输模式。在此模式下传输文件时,文件(理想情况下)会从源系统的原生格式转换为目标系统的原生格式。例如,当使用文本模式将文本文件从 Windows 上传到 Unix 系统时,文件行尾会从 CR+LF 转换为 LF。
WinSCP 默认对所有文件使用二进制传输模式。了解如何配置它以使用文本/ASCII 传输模式。您可能还需要配置正确的服务器端文本文件格式。
相反,当你想强制 WinSCP 使用二进制模式时,即使在文本编辑器中编辑文件,你也必须使用外部文本编辑器(WinSCP 内部编辑器不支持 Unix 文件格式)并配置 WinSCP不强制编辑文件使用文本模式。还要确保您的外部文本编辑器以您需要的格式保存文件(现在大多数文本编辑器都支持不同的文本文件格式,而不仅仅是编辑器运行平台的原生格式)。
传输模式的已知问题
- Pure-FTPd FTP 服务器:在文本/ASCII 模式下下载带有 Windows 行尾 (CR+LF) 的文件时,服务器会将 LF 替换为 CR+LF,从而导致 CR+CR+LF 不正确。在 WinSCP 的内部编辑器中打开此类文件时,编辑器会将该序列解释为两个行尾 (CR 和 CR+LF),从而导致每个内容行后都有一个空行。保存文件时,内部编辑器会保存两个 Windows 行尾 CR+LF 和 CR+LF。上传时,它们会转换为两个 LF。解决方法是使用外部编辑器并确保 WinSCP不强制对已编辑文件使用文本模式。
调试文本文件转换
如果启用(或禁用)文本/ASCII 传输模式不能解决问题,并且目标系统仍然错误地识别您传输/编辑的文件,则需要找出文件在哪个步骤中被错误转换(或尚未转换)。
要检测 Windows 上文件使用的行尾,请在 PowerShell 控制台上使用以下命令显示给定文件前 100 个字符的十六进制转储(example.txt
):
Get-Content -Encoding Byte -TotalCount 100 example.txt |% {Write-Host ("{0:x2} " -f $_) -NoNewline}; Write-Host
对于 Windows 格式的以下内容的文件
One
Two
它显示:
4f 6e 65 0d 0a 54 77 6f 0d 0a
请注意两个序列0d 0a
(CR + LF),它们表示 Windows 格式。
要检测 Unix/Linux 系统上文件使用的行尾,请使用命令:
xxd example.txt | head
(替代方案是hexdump example.txt | head
或od example.txt | head
。)
对于与上面相同的文件,只是采用 Unix 格式,它显示:
0000000: 4f6e 650a 5477 6f0a One.Two.
请注意表示 Unix 格式的字符0a
(LF)。
如果您没有远程系统的 shell 访问权限,请使用二进制编码下载文件,然后在本地二进制相同的副本上使用 PowerShell 命令。
使用这些技术可以检测源文件和目标文件的格式。编辑文件时,还可以检测编辑器保存的已编辑文件的本地临时副本的格式。请参阅首选项临时副本的位置。
请求支持
如果上述内容无法帮助您了解问题,并且您决定寻求进一步支持,请提供所有发现,包括源文件和目标文件的副本。编辑文件时,还请提供编辑器保存的本地临时副本。将文件附加到支持请求时,最好压缩 (ZIP) 文件,以避免浏览器更改文件格式。
(我是 WinSCP 的作者)
答案3
===我唯一的解决方案===
方法1:
-打开文件(使用 Notepad++),打开“查找和替换”窗口 [Ctrl+F](选中“搜索模式”下的“扩展”),然后输入\r\n在第一行,\n在第二个中点击“全部替换” 并保存。
方法2:
-在 ”偏好设置>Transer>默认“ 选择 ”自动(传输模式)“;
-然后在“文本“窗口,设置这样的条件(但我还没有很好地测试过它们):
所以,现在您的问题可能已经解决了。很多人都有这个问题,因为 WINSCP 默认(在某些情况下)会删除新行。
答案4
这里不再有双换行符。我的解决方案是取消选中编辑器首选项中的“强制在外部编辑器中对文件使用文本传输模式”。