通过FTP上传php文件时,所有换行符和CR都会在上传时丢失



我可以下载我没有上传的文件,回车是及时的,但上传后我的文件会放在一行。

这使得对该应用程序进行故障排除变得困难,因为存在错误,但所有内容都在第1行。

为什么会发生这种情况?

FTP不太可能"把所有东西都放在一行"。更有可能的是,该文件使用*nix样式的行尾,并且您以二进制模式将该文件上载到Windows机器或类似的机器。

看,不同的平台有不同的字符序列来表示"新行"。在Windows中,这是最常见的CR+LF,但在*nix上,它只是LF。问题是,很多软件都假设文本文件应该有什么行结尾,如果它看到LF字符,就不会把它看作换行符。所以一切看起来都在一条线上。(我不认为PHP对行尾如此挑剔,但我见过其他语言对此感到抓狂。)

二进制模式逐字节传输文件,不转换行尾。如果你正在下载或上传图片或其他什么东西,这很好。但是,如果你在运行不同操作系统的机器之间以二进制模式传输文本文件,你可能会看到"不正确"的行尾。

解决方案:对PHP文件使用ASCII模式。大多数FTP客户端都设置了使用何种模式,甚至对某些类型的文件使用何种模式。由于PHP文件是文本,所以在大多数情况下,它们可能应该以ASCII模式传输。

适用于我的解决方案:

  1. 使用Atom.io编辑器
  2. 安装Atom封装线路端接转换器
  3. 在Atom中打开文件>标记所有>右键单击>将行结束转换为>Unix格式
  4. 保存文件并上传到服务器(如果是JS文件,请在浏览器中打开,看看换行符现在是否正确)

这里的一些背景信息:

以文本/ASCII模式下载以Windows行结尾(CR+LF)的文件时,服务器会将LF替换为CR+LF,从而导致CR+CR+LF不正确。当在WinSCP的内部编辑器中打开此类文件时,编辑器将序列解释为两行结尾(CR和CR+LF),从而在每一行内容之后都会出现一行空白。保存文件时,内部编辑器会保存两个Windows行尾CR+LF和CR+LF。上传后,它们被转换为两个LF。一种解决方法是使用外部编辑器,并确保WinSCP不会对编辑的文件强制使用文本模式。

最新更新