「サブセット」WOFF をつくってみる(1)

フォント関係の記事を Qiita で見ていましたら、ウェブでの表示用に「サブセット化」するというニーズもあるそうです。

日本語Webフォントの流行の最適化「NotoSans」「サブセット化」 | Qiita

こうしたサブセットは、FontForgeスクリプトでもつくることはできそうです。 差し当たって、ここではまず常用漢字のリストを取得することを考えてみましょう。

Wikipedia から常用漢字を取得してみる

常用漢字一覧の入手元としては候補はいくつかありそうですが、ここでは こちらWikipedia のページから取得してみることにします。 ページのレスポンスを次のように取得できるので

import urllib.parse
from urllib.request import Request, urlopen

uri = urllib.parse.quote(u"//ja.wikipedia.org/wiki/常用漢字一覧")
response = urlopen(Request(f"https:{uri}"))

ここで得た response をつかって、XPath で希望の箇所をだけ抜き取ってみます。

from lxml import etree

tree = etree.parse(response, etree.HTMLParser())
hans = tree.xpath(u"//h2//span[text()='一覧']/following::table[1]//tr[not(@style)]/child::td[2]/a/text()")

for c in hans: print(c)

もちろん、スクレイピングは記事の書かれ方に依存してしまいますから、永続的にこれで期待の結果が得られる保証はありません。たとえば、ここでは「削除された漢字の列には style が当たっている」とみなしていますし、目的の漢字は td の直下の a に書かれているとみなしています。

ところで、これを実際に動かして wc -l で行数をみると、2137 返ってきてしまいます。Wikipedia の表は、行にインデックスが振られているので漢字の総数がわかりますが、漢字の数は 2136 のはずですから、1 つ多いです。 なぜだろうと思って、ためしに sort してみたりすると、ひとつ毛色のちがうものが見つかります。表をよくみると 830 個目に漢字が 2 つあるのですね。Wikipedia の著者、かなり知識が細かいです (^^;

次回もしできそうだったら、このリストをつかって WOFF をつくってみましょう(そんな記事は書かないかもしれませんが)。