现象:文件名没乱,顺序乱了

文件夹里的文件名排得整整齐齐:

1.jpg2.jpg3.jpg …… 11.jpg12.jpg

但在某些看图工具里翻页,顺序会变成:

1.jpg10.jpg11.jpg12.jpg → …… → 2.jpg3.jpg

看漫画时这叫“跳页”,看扫描件时这叫“乱序”,看连拍照片时这叫“这软件有问题”。

有趣的是,打开 Windows 资源管理器看,顺序又是对的。因为“排序”这件事发生在每个程序内部,不同程序可以有不同的规则。

原因:字典序是“一个字符一个字符地比”

计算机里最传统、最通用的字符串排序规则是字典序(lexicographic order)。它的做法很朴素:

  1. 先比较两个名字的第 1 个字符,谁小谁排前面
  2. 如果第 1 个字符相同,就比较第 2 个字符
  3. 一直比下去,直到分出大小,或者其中一个名字先结束(更短的那个排前面)

按这个规则比较 10.jpg2.jpg

  • 第 1 个字符:12,字符 1 比字符 2
  • 结果已经出来了——10.jpg 排在 2.jpg 前面

它根本不会去看后面还有几位数字。在字符的世界里,“10”不是数字十,而是“字符 1 后面跟着字符 0”。

字典序没有错,它只是不知道文件名里的那串字符,其实是一个数。

自然排序:把数字当数字比

自然排序(natural sort,也叫“人类排序”)的思路是:先把文件名切成一段段“数字”和“非数字”,数字段按数值大小比,其余按字符比。

于是比较 10.jpg2.jpg 时,两者的第一个“数字段”是 102——按数值比,10 大于 2,顺序就对了。

这就是为什么 Windows 资源管理器、macOS 的 Finder 看起来都“正常”——它们默认用了自然排序。而很多看图工具为了简单,直接用了语言内置的字符串比较。

imgview 的排序规则

imgview 的翻页顺序用的是自然排序,具体表现是这样:

文件名字典序(部分工具默认)自然序(imgview)
1.jpg, 8.jpg, 9.jpg, 10.jpg, 11.jpg1 → 10 → 11 → 8 → 9 ❌1 → 8 → 9 → 10 → 11 ✅
shot_1.png … shot_9.png, shot_10.pngshot_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.pngimg-10 → img-2 ❌img-2 → img-10 ✅

几个细节:

  • 前导零不会坏事——a1 < a002 < a10,按数值比较,补不补零都能排对
  • 大小写不影响顺序——IMG_1.jpgimg_2.jpg 不会因为大小写被分到两堆去
  • 多个数字段也认得——v1.2.pngv1.10.png 会按 2 与 10 比较,顺序正确
  • 扩展名不参与排序判断——决定顺序的是文件名主体

哪些场景最容易踩到这个坑

  • 漫画和画集——文件名通常就是纯页码 1200,最容易乱,也最影响体验
  • 扫描件与合同——一页一个文件,跳页意味着漏看内容
  • 导出序列——PPT 导出图片、视频抽帧、设计稿逐页导出,通常就是 1N
  • 教程截图——step1step2……step10,按字典序看会先看第 10 步
  • 相机的连拍——如果文件名是 IMG_1 这种短编号,同样会乱(不过相机照片常见的是四位数编号 IMG_0001,补零补齐所以字典序恰好也是对的)

发现规律了吗?只要文件名里的数字位数不统一,字典序就会出错。四位数编号恰好安全,是因为位数固定。

如果你的文件顺序还是不对,检查这几件事

1. 确认看图工具是不是在按文件名排

有些工具默认按“修改时间”排序。拍照片本来就没问题(拍摄时间就是顺序),但下载的漫画、扫描的文件时间戳往往全都一样或者乱七八糟,这时候按时间排就全乱了。

imgview 的工具栏可以一键切换“文件名 / 修改日期”两种排序,再用同一下按钮切换正序 / 倒序。

2. 文件名里混了不同前缀

001.jpg0001.jpg 会被当成两组,因为“数字前面的字符”不同。

批量下载或多次导出时很容易出现这种情况——建议统一重命名成同一套前缀和位数。

3. 中间夹了非图片文件或子文件夹

有些工具会把子目录里的图也拉进来,顺序自然就串了。imgview 只翻当前目录里的图片文件,不递归子目录。

4. 中文、英文、数字混排

不同字符集的排序权重不同,混排时顺序往往不符合直觉。命名时尽量保持结构一致,比如都用“前缀 + 三位数字”。

给文件命名的一点建议

  • 位数补齐——001002……010,即使是字典序也能排对
  • 前缀统一——别让 page1P2 混在一个目录里
  • 数字放在最后——漫画-第01话-005.jpg 这种“越靠后的数字越细”的结构最不容易出错
  • 别用空格和特殊符号开头——它们在排序里的位置常常出乎意料

当然,如果看图工具本身就用了自然排序,这些讲究就都不必要了。imgview 从第一个版本起就把自然排序当作硬需求——毕竟做这个工具的起因,就是一套被翻乱顺序的画集。

小结

图片顺序乱不是玄学,它就是一次“按字符比大小”和“按数值比大小”的区别。

文件名里的数字,是人用来表达顺序的;看图软件应该看得懂这件事。

相关阅读:我为什么做了一个“只想看图”的工具,以及看图软件横向对比里各家在翻页顺序上的表现。