一些最近踩过的坑
虽然空闲时间不多,但是还是有在维护自己的个人项目。最近遇到的问题有点让人无语,就在这里记录一下吧。
Python 的 str.isdigit()
事情的起因是,有人试图在查歌的时候查「⑨」。
这似乎并没有什么问题,TA 的意图多半是查找「チルノのパーフェクトさんすう教室」。
而我的处理逻辑中,有一部分是:如果用户的输入是纯数字,就将其转换为数字并用 ID 查歌。
这似乎也没什么问题。
两件事正好碰在一起的时候,问题就来了:
1 | if kw.isdigit() and int(kw) ...: |
啊?
1 | '⑨'.isdigit() |
啊??
连夜启动 Python 文档 - str.isdigit()
,
数字包括十进制字符和需要特殊处理的数字,如兼容性上标数字。这包括了不能用来组成 10 进制数的数字,如 Kharosthi 数。严格地讲,数字是指属性值为 Numeric_Type=Digit 或 Numeric_Type=Decimal 的字符。
这时候群友开始提议:\d+
然后另外一个群友掏出了这个:
1 | import re |
……
我的解决方法:定义一个严格的 isdigit()
函数。
1 | import string |
让 pillow 识别到 libraqm
这事情的起因是,我发现渲染图片上的文字有一些 OpenType 的高级特性没有启用(主要是指 kerning)。而如果需要在 pillow 中使用这些特性,首先需要正确安装依赖库 libraqm
。
我不知道 pillow 的官方文档上面写的到底是真是假,总之我读完意思就是「依赖库我们都打在 wheel 里啦,你装好就能用!」
然而不管实际上是不是这个意思,还是说要用户自己安装 FriBiDi
,总之 raqm 依赖都不是开箱即用的。
Linux aarch64 环境在我的测试下,没有手动安装 libraqm 之前是无法使用 / 检测到 raqm 支持的。Windows 更不用说,且 Linux wheel 里尚且还有 .so 文件,Windows 的 wheel 中根本没有库的 DLL。
但是 Linux 至少安装起来相对方便一点,仓库中有安装脚本,只需要准备好基本的 g++ 构建环境和 meson 就可以一键安装。在 Windows 平台手动编译这些东西,对于我这种没装 Visual Studio 也没装 MSYS2/MinGW 的,有点过于痛苦了。
好巧不巧,Unofficial Windows Binaries for Python Extension Packages 这个网页刚好前两天打不开了。但是我还是在 Wayback Machine 里找到了下载链接(还好静态资源没有一起失效)。不过放在 site-packages/PIL 里并不能让 pillow 识别到,只能新建了一个目录放进 PATH 了。
简单总结一下:
Linux:安装构建环境所需软件包,使用仓库中的 depends/install_raqm.sh
安装。
Windows:想办法找到 DLL 或者自行构建 libraqm & FriBiDi DLL,然后放置在 pillow 可以识别到的位置。
以上均为胡言乱语,如有事实错误,本人概不负责,请读者见谅。