生成式软件工程
搜索

写代码用的文件:编码、标点与换行

代码就是一份文本文件。这一篇讲清楚它和 Word 文档的差别,以及三个最容易让人卡一整晚的细节。

这一页讲什么
  • 写代码用什么软件打开文件,为什么不能用 Word;
  • 编辑器上那些行号、颜色、缩进是干什么的;
  • UTF-8 与乱码:同一个文件为什么在两台机器上显示不一样;
  • 全角标点和半角标点,为什么中文引号会让程序直接报错;
  • Windows 与 macOS 的换行符不同,协作时会出什么麻烦。

一、代码文件是纯文本,Word 文档不是

Word 文档里除了字,还存着字体、字号、加粗、页边距、批注。这些信息混在字中间,程序读不懂。 写代码用的文件是纯文本(plain text):只有字,没有任何排版信息。

所以有两条规矩:

生活类比 纯文本像一张白纸,上面只有字。Word 文档像一张已经排好版的海报,字、字号、留白、加粗全都定死了。 程序只认白纸上的字,拿到海报它只能看到一堆看不懂的编码。

二、编辑器和记事本的差别

记事本能打开纯文本,但它是给普通人写的,缺三样写代码必需的东西。专用的代码编辑器把这三样补上了:

功能作用没有它会怎样
行号每行左边显示序号报错说「第 12 行」时,你数不出来是哪一行
语法着色关键字、字符串、注释显示成不同颜色少一个引号、括号没配对,肉眼很难发现
显示空白字符把空格、制表符显示成小点看起来左边齐整的代码其实参差不齐,Python 会直接报错

装一个就够,不必纠结选哪个。VS Code 是三套系统上都能用的免费编辑器,教程最多;

Windows:到 code.visualstudio.com 下载安装包,一路下一步。装完在开始菜单里找「Visual Studio Code」。

macOS:到同一个网址下载,把图标拖进「应用程序」。也可以在终端执行 brew install --cask visual-studio-code。

打开一个文件的办法:在编辑器里点「文件 → 打开」,选中文件。或者在文件夹上按右键,选「用 VS Code 打开」。

关键结论 编辑器和 Word 是两类东西。编辑器不负责排版,只负责让你看清每一个字符,包括看不见的空格与换行。

三、UTF-8 与乱码

电脑里存字,存的是一串数字。哪一串数字对应哪个字,这套对应表叫编码(encoding)。

编码有好几套。中文环境下常见的两套是 UTF-8 与 GBK。 同一个汉字在两套表里的数字不同。用 UTF-8 存的文件,拿 GBK 去读,就会显示成一堆方块或者奇怪符号,这叫乱码。

文件本身没坏,只是读它的表拿错了。解决办法是让编辑器按正确的表重新读一遍。

Windows:VS Code 窗口右下角会显示当前编码,点它,选「通过编码重新打开」,再选 UTF-8。 记事本另存为时,右下角有一个编码下拉框,选 UTF-8。

macOS:系统默认就用 UTF-8,很少遇到乱码。VS Code 同样在右下角显示并切换编码。

常见坑:程序报「编码错误」 报错里出现 UnicodeDecodeError、utf-8 codec can't decode 这类字样,意思是文件不是 UTF-8 存的。 统一做法:把源文件另存为 UTF-8,重新运行。写代码一律用 UTF-8,这个习惯能省掉大量麻烦。

四、全角与半角:中文输入法埋的雷

这一条是零基础同学最高频的报错来源,值得单独讲。

中文输入法有全角和半角两种状态。中文标点通常是全角,占两个字符宽, 长得也稍微胖一点。英文标点是半角,占一个字符宽。

符号半角(程序认识的)全角(程序不认识的)
双引号"“ ”
单引号'‘ ’
括号( )( )
逗号,,
冒号::

程序只认半角那七个。写成全角,它会认为这是一个不认识的字符,然后报错。而这两个符号在人眼里几乎一样, 所以很难自查。

常见坑:SyntaxError 里出现奇怪的字符 报错写 SyntaxError: invalid character '“' (U+201C),指的就是全角引号。 U+201C 是它在编码表里的编号,比半角双引号的 U+0022 靠后很多。 看到 U+2 开头的编号,基本可以断定是全角标点。

三条预防办法,按可靠程度排序:

  1. 写代码时把输入法切到英文。按 Shift 或 Ctrl + 空格 切换,看屏幕角落的「中」「英」标记。
  2. 让编辑器帮你标出来。VS Code 会把全角标点显示成更宽的样子,配上语法着色很容易看出颜色不对。
  3. 报错时先看编号。报错里给出 U+ 编号的,去查这个编号是什么字符。

五、换行符:两个系统用两套记号

按一次回车,文件里其实写入了一个看不见的记号,叫换行符。两套系统用的记号不同。

系统换行符叫法
Windows两个字符CRLF
macOS、Linux一个字符LF

一般情况下感觉不到差别,编辑器都会自动处理。麻烦出现在两处:

VS Code 右下角会显示当前文件用的是 CRLF 还是 LF,点它可以切换。

团队协作时的通行做法:统一用 LF。Git 有一个配置项 core.autocrlf 专门管这件事, 它在 Windows 上提交时自动换成 LF,检出时再换回 CRLF。第 8 篇讲 Git 时会再遇到它。

六、亲手建一个文件并跑起来

把前面几篇学的东西连起来做一遍,这是第一次完整走通「写文件 → 运行 → 看到结果」。

  1. 打开编辑器,新建文件,输入下面两行。注意引号与括号都要用半角:
    print("你好,这是我写的第一个程序")
    print(1 + 1)
  2. 保存。文件名写 hello.py,位置选第 2 篇建的 gse-practice 目录。后缀必须写 .py,编辑器靠它判断该用哪种语言着色。
  3. 打开终端,进入那个目录,执行 python3 hello.py。
  4. 屏幕上应该出现两行:中文那句话,和 2。
常见坑:文件名变成了 hello.py.txt Windows 默认隐藏已知类型的扩展名。你输入 hello.py,系统偷偷补成 hello.py.txt, 看起来名字对了,后缀却不对,运行时报找不到文件。 关掉这个选项:资源管理器上方「查看」→ 勾上「文件扩展名」。
现在就做 ① 装好编辑器,用它打开第 2 篇写的 note.txt,确认左边有行号。
② 新建 hello.py,写入上面那两行,保存,用 python3 hello.py 跑一遍。
③ 故意把其中一个引号改成中文全角引号,再跑一次,看报错里的 U+ 编号。
④ 改回半角,确认能跑通。把这次报错的样子记下来,以后一眼就能认出来。

自测

1. 为什么不能用 Word 写代码?
Word 文档里除了文字,还存着字体、字号、排版这些信息,混在内容中间,程序读不懂。代码文件必须是纯文本,只有字,没有任何排版数据。用 Word 存出来的 .docx 程序打不开。
2. 文件出现乱码,是文件坏了吗?
多数情况没坏,是读它的编码表拿错了。用 UTF-8 存的中文,拿 GBK 去读就会变成乱码。让编辑器按正确的编码重新打开即可。写代码统一用 UTF-8,能避免绝大多数这类问题。
3. 为什么中文引号会让程序直接报错?
中文引号是全角字符,在编码表里的编号和英文半角引号完全不同。程序只认半角引号作为字符串的边界,看到全角引号就认为遇到了不认识的字符,于是报语法错误。两者外形几乎一样,所以很难用眼睛发现。
4. 把 Windows 上的脚本拿到 Linux 上跑,为什么可能报「找不到解释器」?
Windows 的换行符是两个字符,Linux 是一个。第一行里指定的解释器路径后面会多出一个看不见的字符,Linux 把它当成路径的一部分,于是找不到这个解释器。把文件换行符改成 LF 即可。