一、走近CRLF和LF
CRLF和LF是控制字元,是換行字元的兩種符號表示。CRLF是”carriage return”和”line feed”的縮寫,表示回車和換行。LF是”line feed”的縮寫,表示換行。
在Windows操作系統下,回車和換行使用的是CRLF,而在Unix/Linux和Mac OS X操作系統下,回車和換行使用的是LF。CRLF和LF主要在文本文件中使用,例如代碼文件、配置文件等。
下面我們通過一個簡單的示例來理解它們的區別:
<html>
<head>
<title>歡迎</title>
</head>
<body>
</body>
</html>
這是一個簡單的HTML文檔,該文檔以Windows操作系統下的記事本編輯並保存。我們可以使用文本編輯器或hexdump等工具查看文檔的二進位表示:
00000000: 3C68 746D 6C3E 0D0A 3C68 6561 643E 0D0A <html>..<head>..
00000010: 3C74 6974 6C65 3E0D 0A20 20 20 20 20 20 20 20 <title>..
00000020: E68A 8AFE E5 91 98 3C2F 7469 746C 653E 0D0A ...</title>..
00000030: 3C2F 6865 6164 3E0D 0A3C 626F 6479 3E0D 0A </head>..<body>..
00000040: 3C2F 626F 6479 3E0D 0A3C 2F68 746D 6C3E 0D0A </body>..</html>..
我們可以看到,Windows使用的是CRLF,而Unix/Linux或Mac OS X使用的是LF。在文本文件中使用LF比使用CRLF的好處是更加節省空間。例如,在一個100M大小的文本文件中,使用LF相比CRLF格式可以節省幾十M的空間。
二、不同場景下的使用
CRLF和LF在不同的場景下有不同的使用方式:
1. 網路傳輸
在網路傳輸中,特別是在高速網路中,使用LF比使用CRLF更加高效,因為LF只佔用一個字元。在編寫網路伺服器或客戶端程序時,為了更好地支持LF和CRLF,一般會加入兼容性處理。
例如,以下是一個支持CRLF和LF的簡單的echo伺服器程序:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define SERVER_PORT 12345
#define MAX_LINE 256
int main(int argc, char* argv[])
{
struct sockaddr_in sin;
char buf[MAX_LINE];
int len;
int s, new_s;
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("simplex-talk: socket");
exit(1);
}
if ((bind(s, (struct sockaddr*)&sin, sizeof(sin))) < 0) {
perror("simplex-talk: bind");
exit(1);
}
if ((listen(s, 2)) < 0) {
perror("simplex-talk: listen");
exit(1);
}
while (1) {
if ((new_s = accept(s, (struct sockaddr*)&sin, &len)) < 0) {
perror("simplex-talk: accept");
exit(1);
}
while ((len = recv(new_s, buf, sizeof(buf), 0))) {
if (len <= 0) break;
buf[len] = '\0';
if (buf[len - 1] == '\n') {
buf[len - 1] = '\0';
}
printf("Client:%s\n", buf);
send(new_s, buf, strlen(buf), 0);
}
close(new_s);
}
return 0;
}
使用telnet工具連接該伺服器,可以看到伺服器返回的內容是CRLF格式。
2. 編程風格
在不同編程語言中,換行使用的方式也有不同。在C語言中,回車和換行使用的是CRLF(”\r\n”),而在Python中則使用LF(”\n”),在Java程序中默認使用LF。即使在同一編程語言中,使用LF或CRLF的風格也各不相同。
下面是一個Python程序,它將一個字元串寫入到文件中:
s = 'Hello world'
with open('file.txt', 'w') as f:
f.write(s + '\n')
該程序使用的是LF換行符。而下面的C程序使用的是CRLF:
#include<stdio.h>
int main()
{
printf("Hello world!\r\n");
return 0;
}
三、CRLF和LF的轉換
在不同操作系統和編碼風格中,文件的換行符可能會不同。因此,我們需要在不同系統之間進行轉換:
1. Windows到Unix/Linux的轉換
有些應用程序或服務是在Unix/Linux平台下運行的,因此我們需要將Windows下的文本文件轉換為Unix/Linux下的格式。常用的工具是dos2unix和tr命令:
#dos2unix
$ dos2unix filename
# tr
$ tr -d '\r' <filename> >newfilename
2. Unix/Linux到Windows的轉換
同樣地,有些應用程序或服務是在Windows平台下運行的,因此我們需要將Unix/Linux下的文本文件轉換為Windows下的格式。常用的工具是unix2dos和sed命令:
#unix2dos
$ unix2dos filename
# sed
$ sed -e "s/$/`echo -e \\\r`/" <filename> >newfilename
以上僅是簡單的命令行工具,還有更多的文本編輯器和IDE可以提供轉換功能。
四、結語
CRLF和LF的區別主要在於使用方式的差異。在網路傳輸中,使用LF比使用CRLF更加高效;在編程風格中,使用的風格也各有不同;在不同操作系統和編碼風格中,需要進行轉換。因此,熟練掌握CRLF和LF之間的差異,可以更好地編寫和處理文本文件。
原創文章,作者:JYHNA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370924.html