网站如何更新,网店推广新思维,网站制作app开发,福州制作网站软件昨天有一位名为 sumina 的小伙伴留言反馈了一个很奇怪的问题#xff0c;他在用 Calibre 将某个 TXT 文件转换成 MOBI 格式时出错了#xff0c;而其它的 TXT 文件却可以正常转换#xff0c;并且出错的 TXT 看起来没有什么问题。 在得到这位小伙伴提供的样本 TXT 文件后#… 昨天有一位名为 sumina 的小伙伴留言反馈了一个很奇怪的问题他在用 Calibre 将某个 TXT 文件转换成 MOBI 格式时出错了而其它的 TXT 文件却可以正常转换并且出错的 TXT 看起来没有什么问题。 在得到这位小伙伴提供的样本 TXT 文件后我首先用 Calibre 测试了一下果然出现了如下错误 # 已省略不相关内容…… Python function terminated unexpectedly: [Errno 21] Is a directory: u/var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/ InputFormatPlugin: TXT Input running on /var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/JAVXx3.txt Reading text from file... Detected input encoding as gbk with a confidence of 99.0% Auto detected paragraph type as unformatted Auto detected formatting as textile Running text through textile conversion... Traceback (most recent call last): File /Applications/calibre.app/Contents/Resources/Python/lib/python2.7/site.py, line 154, in main return run_entry_point() File /Applications/calibre.app/Contents/Resources/Python/lib/python2.7/site.py, line 114, in run_entry_point return getattr(pmod, func)() File site-packages/calibre/utils/ipc/worker.py, line 199, in main File site-packages/calibre/gui2/convert/gui_conversion.py, line 42, in gui_convert_override File site-packages/calibre/gui2/convert/gui_conversion.py, line 27, in gui_convert File site-packages/calibre/ebooks/conversion/plumber.py, line 1106, in run File site-packages/calibre/customize/conversion.py, line 244, in __call__ File site-packages/calibre/ebooks/conversion/plugins/txt_input.py, line 268, in convert File site-packages/calibre/ebooks/conversion/plugins/txt_input.py, line 117, in fix_resources IOError: [Errno 21] Is a directory: u/var/folders/1r/1qwpq6f56hz4xp0gwv7br_kr0000gn/C/calibre_3.40.1_tmp_BSEcvF/ 但是遗憾的是错误信息除了提示一个路径“是个文件夹”外([Errno 21] Is a directory )并没有给出更多有价值的信息。而根据以往的使用经验来看转换一个 TXT 跟什么目录并不应该有什么联系。 由于其它 TXT 文件的转换是正常的可以确定 Calibre 的转换功能应该是没问题的。那问题就应该出在 TXT 内容上面的。但是打开 TXT 文件里面的内容除了使用了英文标点符号并没有什么异样没有什么特殊字符也没有什么乱码。看来是时候祭出解决这类“灵异”问题的终极武器——排除大法。 我用人肉二分法的方式在保持转换问题重现的前提下提取 TXT 文档中的内容逐次测试以期将问题缩小到某个段落上。在将范围缩小至 20 段文字后有趣的现象出现了。当保持这 20 段内容时转换问题可重现但是不论删除头几行、后几行还是中间几行段论问题都不会重现就好像问题不是出在某个字符或某个段落上而是呈“分布式”出现的。虽然离问题的根源很近了但是并不显然。 于是我继续缩小范围直至在保持转换问题重现的状态下将内容缩减到如下所示 !逢! !他! !啊! !可! !我! !说! 在这种情况下删除任何一个字符转换问题都会消失。还有一个有趣的现象是当删除其中的“引号”后再转换时输出信息竟然出现了如下这种对于转换 TXT 纯文本文档来说相当奇怪的内容 # 已省略不相关内容…… Converting XHTML to Mobipocket markup... Failed to find image: 逢 Failed to find image: 他 Failed to find image: 啊 Failed to find image: 可 Failed to find image: 我 Failed to find image: 说 Serializing markup content... # 已省略不相关内容…… 纯文本文档怎么会出现与图片相关的信息呢回头再观察“最小化”后的内容发现里面的“惊叹号”是成对重复出现的并且中间都包含一个字符很像一种标记语法。到现在我才搞明白怎么回事。 ▲ Calibre 默认会自动检测 TXT 文档结构 Calibre 在将 TXT 文件转换成 MOBI 格式电子书前会先将其转换成 HTML。在此过程中 Calibre 默认会自动检测 TXT 文档的结构(如上图所示可以看到在【TXT 输入】设置项中的【格式化样式】默认值是【auto】)这就意味着 Calibre 会“自动决定使用哪一个格式化处理器”当它发现某一种标记语法(如 Markdown)重复出现了几次就会认为文档结构使用了该标记语言并试图将其转换成 HTML。 在出现转换问题的样本中由于原文档输入不规范在本应使用中文标点的地方使用了英文标点并且其中过多使用的英文感叹号“!”所呈现的文档结构让 Calibre 误以为使用了 !/carver.png!从测试来看至少出现六次才会被 Calibre 认为是 Textile 语法)。 如果只有这个问题只会导致文档缺字并不会导致转换失败。导致转换失败的根源是在 Calibre 认为该文档使用了 Textile 标记语言的同时还遇到了“错误的标记”也就是叹号后面紧接着的引号(如 !内容!)这就导致 Calibre 在误以为是图片的基础上又尝试在错误的位置引用根本不存在的图片这也是为什么会出现提示某个路径是文件夹的原因。最终在错上加错的情况下转换被中断了。 知道了问题所在解决方法就自然显现了要么预先把原 TXT 文档中的英文标点(至少是英文叹号)全部替换成中文标点要么在转换时将【格式化样式】的值改为【Markdown】或【plain】以禁止 Calibre 解析可能出问题的标记语言(建议同时用【搜索 替换】把英文标点替换成中文标点)。 对于第二种解决方案需要注意一种情况。如果你在转换 TXT 文档的同时需要添加 Markdown 标记以便自动生成电子书目录选用【plain】会导致 Calibre 忽略包括 Markdown 在内的所有结构标记的解析。所以最稳妥的方法是在添加标记的同时预先把文档中的英文标点符号转换成中文或者选用【Markdown】让 Calibre 只检测 Markdown 标记忽略其它可能导致转换出问题的标记。