现象:文件名没乱,顺序乱了
文件夹里的文件名排得整整齐齐:
1.jpg、2.jpg、3.jpg …… 11.jpg、12.jpg
但在某些看图工具里翻页,顺序会变成:
1.jpg → 10.jpg → 11.jpg → 12.jpg → …… → 2.jpg → 3.jpg
看漫画时这叫“跳页”,看扫描件时这叫“乱序”,看连拍照片时这叫“这软件有问题”。
有趣的是,打开 Windows 资源管理器看,顺序又是对的。因为“排序”这件事发生在每个程序内部,不同程序可以有不同的规则。
原因:字典序是“一个字符一个字符地比”
计算机里最传统、最通用的字符串排序规则是字典序(lexicographic order)。它的做法很朴素:
- 先比较两个名字的第 1 个字符,谁小谁排前面
- 如果第 1 个字符相同,就比较第 2 个字符
- 一直比下去,直到分出大小,或者其中一个名字先结束(更短的那个排前面)
按这个规则比较 10.jpg 和 2.jpg:
- 第 1 个字符:
1和2,字符1比字符2小 - 结果已经出来了——
10.jpg排在2.jpg前面
它根本不会去看后面还有几位数字。在字符的世界里,“10”不是数字十,而是“字符 1 后面跟着字符 0”。
字典序没有错,它只是不知道文件名里的那串字符,其实是一个数。
自然排序:把数字当数字比
自然排序(natural sort,也叫“人类排序”)的思路是:先把文件名切成一段段“数字”和“非数字”,数字段按数值大小比,其余按字符比。
于是比较 10.jpg 和 2.jpg 时,两者的第一个“数字段”是 10 和 2——按数值比,10 大于 2,顺序就对了。
这就是为什么 Windows 资源管理器、macOS 的 Finder 看起来都“正常”——它们默认用了自然排序。而很多看图工具为了简单,直接用了语言内置的字符串比较。
imgview 的排序规则
imgview 的翻页顺序用的是自然排序,具体表现是这样:
| 文件名 | 字典序(部分工具默认) | 自然序(imgview) |
|---|---|---|
| 1.jpg, 8.jpg, 9.jpg, 10.jpg, 11.jpg | 1 → 10 → 11 → 8 → 9 ❌ | 1 → 8 → 9 → 10 → 11 ✅ |
| shot_1.png … shot_9.png, shot_10.png | shot_1 → shot_10 → shot_2 ❌ | shot_1 → shot_2 → … → shot_10 ✅ |
| 第1页.jpg, 第8页.jpg, 第10页.jpg | 第1页 → 第10页 → 第8页 ❌ | 第1页 → 第8页 → 第10页 ✅ |
| img-2.png, img-10.png | img-10 → img-2 ❌ | img-2 → img-10 ✅ |
几个细节:
- 前导零不会坏事——
a1<a002<a10,按数值比较,补不补零都能排对 - 大小写不影响顺序——
IMG_1.jpg和img_2.jpg不会因为大小写被分到两堆去 - 多个数字段也认得——
v1.2.png和v1.10.png会按 2 与 10 比较,顺序正确 - 扩展名不参与排序判断——决定顺序的是文件名主体
哪些场景最容易踩到这个坑
- 漫画和画集——文件名通常就是纯页码
1到200,最容易乱,也最影响体验 - 扫描件与合同——一页一个文件,跳页意味着漏看内容
- 导出序列——PPT 导出图片、视频抽帧、设计稿逐页导出,通常就是
1到N - 教程截图——
step1、step2……step10,按字典序看会先看第 10 步 - 相机的连拍——如果文件名是
IMG_1这种短编号,同样会乱(不过相机照片常见的是四位数编号IMG_0001,补零补齐所以字典序恰好也是对的)
发现规律了吗?只要文件名里的数字位数不统一,字典序就会出错。四位数编号恰好安全,是因为位数固定。
如果你的文件顺序还是不对,检查这几件事
1. 确认看图工具是不是在按文件名排
有些工具默认按“修改时间”排序。拍照片本来就没问题(拍摄时间就是顺序),但下载的漫画、扫描的文件时间戳往往全都一样或者乱七八糟,这时候按时间排就全乱了。
imgview 的工具栏可以一键切换“文件名 / 修改日期”两种排序,再用同一下按钮切换正序 / 倒序。
2. 文件名里混了不同前缀
001.jpg 和 0001.jpg 会被当成两组,因为“数字前面的字符”不同。
批量下载或多次导出时很容易出现这种情况——建议统一重命名成同一套前缀和位数。
3. 中间夹了非图片文件或子文件夹
有些工具会把子目录里的图也拉进来,顺序自然就串了。imgview 只翻当前目录里的图片文件,不递归子目录。
4. 中文、英文、数字混排
不同字符集的排序权重不同,混排时顺序往往不符合直觉。命名时尽量保持结构一致,比如都用“前缀 + 三位数字”。
给文件命名的一点建议
- 位数补齐——
001、002……010,即使是字典序也能排对 - 前缀统一——别让
page1和P2混在一个目录里 - 数字放在最后——
漫画-第01话-005.jpg这种“越靠后的数字越细”的结构最不容易出错 - 别用空格和特殊符号开头——它们在排序里的位置常常出乎意料
当然,如果看图工具本身就用了自然排序,这些讲究就都不必要了。imgview 从第一个版本起就把自然排序当作硬需求——毕竟做这个工具的起因,就是一套被翻乱顺序的画集。
小结
图片顺序乱不是玄学,它就是一次“按字符比大小”和“按数值比大小”的区别。
文件名里的数字,是人用来表达顺序的;看图软件应该看得懂这件事。
相关阅读:我为什么做了一个“只想看图”的工具,以及看图软件横向对比里各家在翻页顺序上的表现。