PHP中\r\n和\n的区别

20

简单的问题...

我看到有人告诉我在不同的地方使用"\r\n",而其他人告诉我在同一个地方使用"\n"。我确定其中一个是正确的,另一个是错误的。例如 - 当设计mail()头文件时:

教程#1:

//define the headers we want passed. Note that they are separated with \r\n 
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com"; 
//add boundary string and mime type specification 
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 

教程 #2(注意头部参数):

mail($to, $subject, $body, 
    "From: " . $from . "\n" . 
    "bcc: " . $bcc . "\n" . 
    "MIME-Version: 1.0\n" . 
    "Content-Type: multipart/alternative;\n" . 
    "     boundary=" . $mime_boundary_header)

我有点困惑,但显然这会造成某种影响,因为用其中一种方式时我的标题起作用了,而用另一种方式时它们仅有时起作用。


这里的问题是两者都可能正确。这完全取决于你对字符串要做什么。教程1:你只是创建字符串(不做任何操作)。教程2:你正在向函数“mail()”传递字符串。如果在教程1中,你直接将它们粘贴到套接字上,它可能会工作(因为它似乎符合RFC 821),但你需要关注实现细节。在教程2中,一切取决于mail()文档所说的正确发送字符串的方式。在内部,它可能会为你转换文本。 - Martin York
3个回答

27

\r\n是Windows系统的换行符。

\n是UNIX系统的换行符。

这些字符是看不见的。从我的经验来看,\n在Windows上通常也可以使用。

有些人更喜欢使用PHP_EOL常量而不是这些字符,以实现跨平台移植性。

echo 'hi' . PHP_EOL;
echo "hi\n";

$headers = "From: webmaster@example.com" . PHP_EOL 
           . "Reply-To: webmaster@example.com"; 

那么客户端就无所谓了吗?例如...当我为我的mail()制定头部时。如果我正在运行Linux,我应该使用\n而不是\r\n,对吧?还是我需要担心读者的系统呢? - johnnietheblack
不应该有关系。只需使用 \n。根据我的经验,大多数 Windows 应用程序接受 \n 作为行尾。$headers = "From: webmaster@example.com".PHP_EOL."Reply-To: webmaster@example.com"; 这段代码是最安全的。 - Yada
7
这个答案是错误的。邮件头必须用\r\n分隔。 - Evert
1
转换一下……问题不是关于邮件头的……那只是一个例子。我想知道\r和\n是什么。但是……在将我的邮件头切换到\n后,它似乎工作得更好了。你能指导我找一个很棒的教程吗? - johnnietheblack
1
这个回答是正确的,但不是问题的正确答案。这个回答涉及文件系统中存储的特定平台的行结尾序列。问题是有关与协议一起使用所需的字符。在这种情况下,是邮件协议 RFC 821。它明确指出您应该使用 "<CR><LF>" => "\r\n"。 - Martin York

6
根据RFC 821(即SMTP协议),邮件头和内容中的行尾应始终为\r\n<CR><LF>),但实际上大多数邮件服务器都可以正确处理这三种类型的行尾(据说,一些旧的基于UNIX的邮件服务器无法处理\r\n但可以处理\n)。

我的电脑出了点问题,换行符/r/n出了点小差错。:( - johnnietheblack
7
可能是因为你使用了正斜杠而不是反斜杠。 - D34dman

5

是的,几个小时前我刚刚在读杰夫的博客,然后看到了这篇文章。巧合吗? - o.k.w
现在这个链接正在重定向到其他页面,请检查一下。 - Akila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接