crlf 和 lf 在效果和含义上有什么区别?
What is the difference between crlf and lf in effects and meaning?
我知道换行和回车的区别return。 Carriage return 将光标移动到行首,换行将光标移动到下一个而不是该行的开头。但是用换行的时候光标不是到下一行的开头吗?那为什么人们说 lf 只将光标移动到下一行而不去开头,而 crlf 转到行的开头然后转到下一行。当使用像 C 这样的编程语言打印“Hello\nHELLO”时,它不会自动在下一行的开头打印 HELLO 吗?那么CRLF和LF有什么区别呢?
DOS 使用回车符 return 和换行符 \r\n
作为换行符,而 UNIX 仅使用换行符 \n
。关于它真的没什么可说的……除了那个。 dos2unix
去掉所有 \r
,或者 cat -v
也会输出行尾。
令人困惑,因为 Windows 和 Unix 对它们的行为不同:
linux-$ printf "abc\ndefg\rhij\r\n" | hexdump -C
00000000 61 62 63 0a 64 65 66 67 0d 68 69 6a 0d 0a |abc.defg.hij..|
0000000e
如您所见,程序只是按照指示将这些字符 (0x0d - CR, 0x0a - LF) 发送到管道 (| hexdump -C
)、文件(您将在其中使用dos2unix
或 unix2dos
),或终端。
如果我们将它发送到终端,您就会开始看到不同之处:
linux-$ printf "abc\ndefg\rhij\r\n"
abc
hijg
这是来自 Linux 上的 URXVT,它被配置为使用常规 Unix 约定(不同于语义)。
在此约定中,\n
被终端视为 \r\n
,因此 abc\ndefg\rhij\r\n
实际上变为 abc\r\ndefg\rhij\r\n
。
这就是为什么终端显示的时候,打印abc
,returns到行首,下降到下一行,打印defg
,returns 到行首,不掉到下一行,用 hij
覆盖该行的前 3 个字符,然后 returns 到行首,并掉到下一行行.
所以回答你的具体问题:
But doesn't the cursor go to the beginning of the next line when using line feed?
"cursor" 假定处理输出的设备是一个终端。所以答案取决于终端的配置方式。在 Unix 终端上答案是“是”。 Windows 并且 DOS 终端未配置为执行此操作。
Then why people says that lf only moves the cursor to next line without going to beginning and crlf goes to beginning of the line and then go to the next line.
因为那是 Windows 和 DOS 终端处理 LF 和 CRLF 的方式。
When using any programming languages like C to print "Hello\nHELLO", doesn't it automatically prints HELLO in the beginning of next line?
啊,这是个好问题。有一个偷偷摸摸的小规则 there:
When writing to a file, device node, or socket/fifo in text mode, \n
is transparently translated to the native newline sequence used by the system, which may be longer than one character. When reading in text mode, the native newline sequence is translated back to \n
. In binary mode, no translation is performed, and the internal representation produced by \n
is output directly.
你看,Unix 终端上的约定(即默认配置)是将\n
视为\r\n
,因此从C 发送Hello\nHELLO
到Unix 终端将导致当遇到 \n
.
时,它也会 return 到行首
另一方面,在 Windows 上,所有这些打印函数都会默默地将您的输入 \n
转换为输出 \r\n
,并且终端会像您一样分别对待它们中的每一个d期待。
在旧的 Mac 上,换行符是 \r
,\n
被静默地翻译成 \r
,终端在 return 时跳到下一行光标到行首。
Then how is there difference between CRLF and LF?
- LF 是所有系统中“换行”的编程语言标准,而 CR 是显示文本的程序的产物,通常是终端。
- 某些系统 (Windows) 在某些情况下会自动将 LF 转换为 CRLF,但会定期处理 CR。
- 某些系统(旧 Mac)在某些情况下会自动将 CR 转换为 CRLF,但会定期处理 LF。
- 一些终端 (Unix) 将 LF 视为 CRLF,但通常将 CR 视为。
- 一些终端(旧 Mac)将 CR 视为 CRLF,但通常将 LF 视为。
我知道换行和回车的区别return。 Carriage return 将光标移动到行首,换行将光标移动到下一个而不是该行的开头。但是用换行的时候光标不是到下一行的开头吗?那为什么人们说 lf 只将光标移动到下一行而不去开头,而 crlf 转到行的开头然后转到下一行。当使用像 C 这样的编程语言打印“Hello\nHELLO”时,它不会自动在下一行的开头打印 HELLO 吗?那么CRLF和LF有什么区别呢?
DOS 使用回车符 return 和换行符 \r\n
作为换行符,而 UNIX 仅使用换行符 \n
。关于它真的没什么可说的……除了那个。 dos2unix
去掉所有 \r
,或者 cat -v
也会输出行尾。
令人困惑,因为 Windows 和 Unix 对它们的行为不同:
linux-$ printf "abc\ndefg\rhij\r\n" | hexdump -C
00000000 61 62 63 0a 64 65 66 67 0d 68 69 6a 0d 0a |abc.defg.hij..|
0000000e
如您所见,程序只是按照指示将这些字符 (0x0d - CR, 0x0a - LF) 发送到管道 (| hexdump -C
)、文件(您将在其中使用dos2unix
或 unix2dos
),或终端。
如果我们将它发送到终端,您就会开始看到不同之处:
linux-$ printf "abc\ndefg\rhij\r\n"
abc
hijg
这是来自 Linux 上的 URXVT,它被配置为使用常规 Unix 约定(不同于语义)。
在此约定中,\n
被终端视为 \r\n
,因此 abc\ndefg\rhij\r\n
实际上变为 abc\r\ndefg\rhij\r\n
。
这就是为什么终端显示的时候,打印abc
,returns到行首,下降到下一行,打印defg
,returns 到行首,不掉到下一行,用 hij
覆盖该行的前 3 个字符,然后 returns 到行首,并掉到下一行行.
所以回答你的具体问题:
But doesn't the cursor go to the beginning of the next line when using line feed?
"cursor" 假定处理输出的设备是一个终端。所以答案取决于终端的配置方式。在 Unix 终端上答案是“是”。 Windows 并且 DOS 终端未配置为执行此操作。
Then why people says that lf only moves the cursor to next line without going to beginning and crlf goes to beginning of the line and then go to the next line.
因为那是 Windows 和 DOS 终端处理 LF 和 CRLF 的方式。
When using any programming languages like C to print "Hello\nHELLO", doesn't it automatically prints HELLO in the beginning of next line?
啊,这是个好问题。有一个偷偷摸摸的小规则 there:
When writing to a file, device node, or socket/fifo in text mode,
\n
is transparently translated to the native newline sequence used by the system, which may be longer than one character. When reading in text mode, the native newline sequence is translated back to\n
. In binary mode, no translation is performed, and the internal representation produced by\n
is output directly.
你看,Unix 终端上的约定(即默认配置)是将\n
视为\r\n
,因此从C 发送Hello\nHELLO
到Unix 终端将导致当遇到 \n
.
另一方面,在 Windows 上,所有这些打印函数都会默默地将您的输入 \n
转换为输出 \r\n
,并且终端会像您一样分别对待它们中的每一个d期待。
在旧的 Mac 上,换行符是 \r
,\n
被静默地翻译成 \r
,终端在 return 时跳到下一行光标到行首。
Then how is there difference between CRLF and LF?
- LF 是所有系统中“换行”的编程语言标准,而 CR 是显示文本的程序的产物,通常是终端。
- 某些系统 (Windows) 在某些情况下会自动将 LF 转换为 CRLF,但会定期处理 CR。
- 某些系统(旧 Mac)在某些情况下会自动将 CR 转换为 CRLF,但会定期处理 LF。
- 一些终端 (Unix) 将 LF 视为 CRLF,但通常将 CR 视为。
- 一些终端(旧 Mac)将 CR 视为 CRLF,但通常将 LF 视为。