らんだむな記憶

blogというものを体験してみようか!的なー

83pv-RKSJ-HとUniJIS2004-UTF32-Hの比較

ぼんやりとCMapを比較しようと思って以下のコードを書いた:
※簡単のため、CMapはcmap-tool.pl -eで展開済みとしている。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, re

def parse_cmap(cmap_f):
    code2cid = {}
    with open(cmap_f) as f:
        for line in f.readlines():
            line = line.rstrip()
            m = re.search(r"^\s*<([0-9a-f]+)>\s+(\d+)\s*$", line)
            if m:
                code = int(m.group(1), 16)
                cid = int(m.group(2))
                code2cid[code] = cid
    return code2cid

def main():
    cmap1_f = sys.argv[1]
    cmap2_f = sys.argv[2]

    cmap1_basename, _ = os.path.splitext(os.path.basename(cmap1_f))
    cmap2_basename, _ = os.path.splitext(os.path.basename(cmap2_f))

    cmap1 = parse_cmap(cmap1_f)
    cmap2 = parse_cmap(cmap2_f)

    cmap1_cid_set = set(cmap1.values())
    cmap2_cid_set = set(cmap2.values())

    print "cmap1:{}, cmap2:{}".format(cmap1_basename, cmap2_basename)
    print "-"*50
    print "* cmap1 - cmap2:", sorted(cmap1_cid_set - cmap2_cid_set)
    print "-"*30
    print "* cmap2 - cmap1:", sorted(cmap2_cid_set - cmap1_cid_set)

if __name__ == "__main__":
    main()

折角なので83pv-RKSJ-HUniJIS2004-UTF32-Hを比較してみる。
結果は結構な差が出ますね〜といったところだ。
Adobe-Japan1-6でのCID124, AJ16-J15でいうところの「ellipsis」にはMacJapaneseのコード0x00ffしか与えられておらず、unicode値が見当たらない。似たようなグリフである三点リーダ、つまりU+2026にはCID668が割り当てられている。
リーダー (記号) - Wikipediaによると、

本来、英語における類似の記号は、省略を意味する場合には ellipsis と呼び、leader は目次の項目とページ数を結ぶ際に用いられるような視線を誘導する記号を指す。

ということで、三点リーダellipsisとは少し異なるようだ。実際には三点リーダは心情的なellipsisとして用いられていることが多いように感じるが…。
逆に合字「fi」はCID112であるが、これにはunicode値U+FB01のみが与えられておりMacJapaneseのコードは割り当てられていない。
そういったわけで、片方のCMapが他方のCMapのサポートしているグリフを完全に包含しているわけではない。