前阵子写了段再简单不过的脚本,读个本地txt,处理完存回去。在自己机器上跑得好好的,中文字句安安静静躺着。后来挪到另一台机器上一跑,打开文件一看,满屏都是问号,像谁把每句话里每个字都戳了个洞。
往深里说,不过是编码的脾气。读文件若不显式指定编码,程序便去看运行环境的脸色,Windows 上常是 gbk,Linux 多半是 utf-8,连同一门语言的不同版本,默认值都能差出十万八千里。你当自己写的是同一段代码,它换了个地方就换了副性情。迁移机器的那一瞬,翻车总是悄无声息。
更磨人的是,有人图省事用二进制模式读,或对解码错误睁只眼闭只眼。我觉得吧乱码并不立刻报错,它只是安静地把损坏的数据写进下游,等你哪天拿这些脏东西去喂别的模块,毛病才从老远的地方冒出来,源头早就淹没了。
我后来学乖了,凡是文本读写,老老实实把 encoding=‘utf-8’ 写清楚。碰上来源不可信的文件,再添一句 errors=‘replace’ 兜底,好歹让坏字符现个身,别偷偷混进队伍里。一个没写清的编码,便应了那句差之毫厘,够你对着眼前的问号,发一下午的呆。