上周帮表弟弄他的单词表:老师发了个 Excel,两列,单词和释义,四百多行。他照网上说的另存成 CSV 拖进 Anki,导进去第一列全是方块加问号,第二列直接空白。他以为 Anki 坏了,其实是文件从 Excel 出来那一刻就已经不是 UTF-8 了。这条链路上的坑不多,但每一个都能让整批卡片报废,按顺序记一下。
一、乱码不是 Anki 的锅,是 CSV 的编码
中文 Windows 上,Excel 的「另存为」里那个「CSV(逗号分隔)」用的是系统 ANSI 编码,也就是 GBK。文件本身没问题,Excel 再打开也正常,可一旦有程序按 UTF-8 去读,第一个汉字就崩。拿 Python 读同一个文件,报的是这个:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte
Anki 导入文本要求 UTF-8,遇到 GBK 不会报这么清楚的错,只会把字节按 UTF-8 硬解,于是你看到的就是乱码。所以别在 Anki 里反复试,先确认文件编码。用记事本打开另存一次、编码选 UTF-8,是最土但最快的办法。想知道手上这个文件到底是不是 UTF-8,不用装工具:记事本另存对话框里编码那一栏会直接告诉你当前是什么,VS Code 右下角也一直挂着,点一下就能转存。
二、存「CSV UTF-8」,但要留意开头那三个字节
Excel 较新的版本里另存为列表往下拉,还有一个「CSV UTF-8(逗号分隔)」,选它出来的就是 UTF-8,这是最省事的一条路。代价是它会在文件最前面写一个 BOM,也就是这三个字节:
ef bb bf
BOM 本身是合法 UTF-8,但如果你用 utf-8 去读,它不会消失,而是变成第一个字符 U+FEFF,粘在第一个字段前面。表现出来就是表头那一格显示成「单词」,前面多一个看不见的方块,Anki 的字段映射里对不上你预期的那一列。Python 里读这种文件要用 utf-8-sig,它认得出 BOM 并替你吃掉;用记事本手改的话,另存时选「UTF-8」而不是「带 BOM 的 UTF-8」也一样干净。
三、分隔符选 Tab,别跟释义里的逗号打架
这条最容易被忽略。释义那一列天生带逗号,一个词两三个义项,用逗号分隔是常态。可文件是逗号分隔的,一行里出现第三个逗号就多切出一列。我随手拿一行试:
take off,起飞; 脱下, 突然走红
按逗号朴素地切,得到三段,第三段「突然走红」会被当成一个独立字段塞进下一列。四百行里只要有几十行这样,导入之后的卡片就是错位的,而且错得很随机,比乱码更难修。
两个办法。一是文件里所有带逗号的字段都用英文双引号包起来,正规的 CSV 解析器认这个规矩,Excel 导出时自己也会包;二是干脆不用逗号,另存时选「文本文件(制表符分隔)」出 .txt,Anki 导入的默认分隔符就是 Tab,释义里出现逗号完全不影响。我倾向第二种,绕过问题比修问题省事。
但这里有个连环坑:选「文本文件(制表符分隔)」出来的 .txt,编码照样是 ANSI,跟 CSV 那条路一模一样。也就是说换分隔符解决了切列问题,编码那一关还得单独再过一次,两件事别混成一件。
四、字段映射、笔记类型、重复检测,一次配齐
导入窗口里左边是文件里的列,右边是你的字段,中间要一一对上。三个地方顺手确认:
第一,有没有多余的列。文件末尾多一个空列很常见,映射时把它设成「忽略」,不然会建出一个永远空着的字段,之后排序、搜索都被它拖累。反过来的情况也有:笔记类型只有两个字段,文件里却有三列,多出来的那列不会自动长成新字段,只能忽略掉,或者先回笔记类型里把字段加上再来导。
第二,笔记类型。如果是挖空卡,导入前就得选 Cloze,正文里写成 {{c1::abandon}} 这种形式;选了基础类型再写挖空语法,{{}} 会原样显示成文字,卡片看着像坏了,其实只是类型不对。
第三,重复怎么算。Anki 判重的依据是第一个字段,所以单词必须排在文件第一列,不能是释义。导入时如果选了跳过重复,四百行里重复的词会安静地少掉,界面上只给你一个数字;反过来选了「即使第一字段重复也导入」,同一个词就会出两张卡,复习时来回撞。这两条都试过一次,才知道该选哪个。
还有一列值得加上:标签。在文件末尾多加一列写标签,映射时指到 Tags,多个标签之间用空格隔开,不是逗号也不是分号。按单元或按考试年份打上,之后想只刷某一部分,筛一下就行,比事后一张张补标签省太多时间。
五、图片和音频不会跟着文本一起进来
文本导入只管文字。释义里要放图片,字段里得写 <img src="apple.jpg">,同时勾上「允许字段中使用 HTML」,图片文件本身要放进 Anki 的 collection.media 目录,文件名和 src 里写的完全一致,大小写也算数。少一步就是空白框。这一步在手机端没法补救,所以制卡放在电脑上做,做完再同步。
顺带一句,改完文件别急着导四百行,先导十行看看字段对不对。错了删掉重来,比导完再一张张改快得多。
你们背单词是一张卡一个词,还是一句话挖一个空?我一直觉得后者记不住拼写,但又说不清是不是自己的问题。