【第7章 I/O编程与异常】\r\n 和 \n\r是一回事吗?
\r\n 和 \n\r 不是一回事,它们是两种完全不同的字节序列,在语义和实际效果上也完全不同。
一、含义对比
| 序列 | 字节(十六进制) | 含义 |
|---|---|---|
\r\n |
0x0D 0x0A |
回车(Carriage Return) + 换行(Line Feed) ✅ Windows 标准换行符 |
\n\r |
0x0A 0x0D |
换行 + 回车 ❌ 不是任何主流操作系统的标准换行符 |
二、行为差异(以终端/编辑器为例)
1. \r\n(标准 Windows 换行)
- 光标先回到行首(
\r),再下移一行(\n)。 - 结果:正常换行到下一行开头。
- 所有 Windows 程序(记事本、CMD、PowerShell 等)都正确识别。
2. \n\r(非标准顺序)
- 先下移一行(
\n),光标停在新行的相同列位置; - 再执行
\r,光标回到该行开头。 - 视觉效果看似“换行了”,但:
- 在某些终端中可能显示异常(如多出空行或光标错位);
- 文本编辑器通常不会将其识别为一个换行符,而是当作两个独立控制字符;
- 在按行解析文件时(如
fgets、Python 的readline()),不会在此处分割行!
三、实际影响示例
假设文件内容为(用转义序列表示):
Hello\n\rWorld
-
Python 读取(默认
newline=None):with open('test.txt', 'r') as f: lines = f.readlines() # 结果:lines = ['Hello\n', '\rWorld\n'] (取决于具体实现,但通常不会在 \n\r 处断行)实际上,Python 的通用换行模式只识别
\n、\r\n、\r作为行分隔符,不识别\n\r。 -
C 语言
fgets():- 只会在遇到
\n时停止(因为它是 Unix 风格换行); \r被视为普通字符,保留在缓冲区中。
- 只会在遇到
-
Git / diff 工具:
- 会将
\n\r视为“内容中的特殊字符”,而非换行,可能导致混乱的 diff 输出。
- 会将
四、结论
- ✅
\r\n是合法且标准的 Windows 换行符。 - ❌
\n\r是非标准、无实际用途的错误组合,应避免使用。
💡 记忆技巧:
“先回车,再换行” —— 就像老式打字机:先把打印头归位(\r),再滚纸一行(\n)。
所以正确顺序是\r\n,而不是反过来。
如果你在代码或数据中看到 \n\r,很可能是程序逻辑错误或字符串拼接失误导致的,建议检查并修正为标准格式(\n 或 \r\n)。

浙公网安备 33010602011771号