写代码用的文件:编码、标点与换行
代码就是一份文本文件。这一篇讲清楚它和 Word 文档的差别,以及三个最容易让人卡一整晚的细节。
- 写代码用什么软件打开文件,为什么不能用 Word;
- 编辑器上那些行号、颜色、缩进是干什么的;
- UTF-8 与乱码:同一个文件为什么在两台机器上显示不一样;
- 全角标点和半角标点,为什么中文引号会让程序直接报错;
- Windows 与 macOS 的换行符不同,协作时会出什么麻烦。
一、代码文件是纯文本,Word 文档不是
Word 文档里除了字,还存着字体、字号、加粗、页边距、批注。这些信息混在字中间,程序读不懂。 写代码用的文件是纯文本(plain text):只有字,没有任何排版信息。
所以有两条规矩:
- 写代码要用文本编辑器打开,不能用 Word。用 Word 存出来的文件,后缀会变成
.docx,里面夹了一堆排版数据,程序直接读不了。 - 改完必须存成纯文本。记事本、文本编辑(macOS 自带)都算,专用的代码编辑器更好用。
二、编辑器和记事本的差别
记事本能打开纯文本,但它是给普通人写的,缺三样写代码必需的东西。专用的代码编辑器把这三样补上了:
| 功能 | 作用 | 没有它会怎样 |
|---|---|---|
| 行号 | 每行左边显示序号 | 报错说「第 12 行」时,你数不出来是哪一行 |
| 语法着色 | 关键字、字符串、注释显示成不同颜色 | 少一个引号、括号没配对,肉眼很难发现 |
| 显示空白字符 | 把空格、制表符显示成小点 | 看起来左边齐整的代码其实参差不齐,Python 会直接报错 |
装一个就够,不必纠结选哪个。VS Code 是三套系统上都能用的免费编辑器,教程最多;
Windows:到 code.visualstudio.com 下载安装包,一路下一步。装完在开始菜单里找「Visual Studio Code」。
macOS:到同一个网址下载,把图标拖进「应用程序」。也可以在终端执行 brew install --cask visual-studio-code。
打开一个文件的办法:在编辑器里点「文件 → 打开」,选中文件。或者在文件夹上按右键,选「用 VS Code 打开」。
三、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: invalid character '“' (U+201C),指的就是全角引号。
U+201C 是它在编码表里的编号,比半角双引号的 U+0022 靠后很多。
看到 U+2 开头的编号,基本可以断定是全角标点。
三条预防办法,按可靠程度排序:
- 写代码时把输入法切到英文。按
Shift或Ctrl + 空格切换,看屏幕角落的「中」「英」标记。 - 让编辑器帮你标出来。VS Code 会把全角标点显示成更宽的样子,配上语法着色很容易看出颜色不对。
- 报错时先看编号。报错里给出
U+编号的,去查这个编号是什么字符。
五、换行符:两个系统用两套记号
按一次回车,文件里其实写入了一个看不见的记号,叫换行符。两套系统用的记号不同。
| 系统 | 换行符 | 叫法 |
|---|---|---|
| Windows | 两个字符 | CRLF |
| macOS、Linux | 一个字符 | LF |
一般情况下感觉不到差别,编辑器都会自动处理。麻烦出现在两处:
- 把 Windows 上的文件拿到 Linux 上跑,脚本可能报「找不到解释器」或者出现
bad interpreter。原因是那个多出来的字符被当成了命令的一部分。 - 用 Git 协作时,每个人系统不同,提交历史里会出现「整个文件都改了」的假改动,其实一个字都没变,只是换行符换了。
VS Code 右下角会显示当前文件用的是 CRLF 还是 LF,点它可以切换。
LF。Git 有一个配置项 core.autocrlf 专门管这件事,
它在 Windows 上提交时自动换成 LF,检出时再换回 CRLF。第 8 篇讲 Git 时会再遇到它。
六、亲手建一个文件并跑起来
把前面几篇学的东西连起来做一遍,这是第一次完整走通「写文件 → 运行 → 看到结果」。
- 打开编辑器,新建文件,输入下面两行。注意引号与括号都要用半角:
print("你好,这是我写的第一个程序")
print(1 + 1) - 保存。文件名写
hello.py,位置选第 2 篇建的gse-practice目录。后缀必须写.py,编辑器靠它判断该用哪种语言着色。 - 打开终端,进入那个目录,执行
python3 hello.py。 - 屏幕上应该出现两行:中文那句话,和
2。
hello.py,系统偷偷补成 hello.py.txt,
看起来名字对了,后缀却不对,运行时报找不到文件。
关掉这个选项:资源管理器上方「查看」→ 勾上「文件扩展名」。
note.txt,确认左边有行号。② 新建
hello.py,写入上面那两行,保存,用 python3 hello.py 跑一遍。③ 故意把其中一个引号改成中文全角引号,再跑一次,看报错里的
U+ 编号。④ 改回半角,确认能跑通。把这次报错的样子记下来,以后一眼就能认出来。
自测
1. 为什么不能用 Word 写代码?
.docx 程序打不开。