PythonのIVS(異字体セレクタ)対応を調べてたのですが、全く出てこない...

誰も困ってないのかしら?

Pythonで普通に文字数とか取得しようとするとIVSはとりあえずダメになると思うんだけど。

s = '\U00008FBB'
print(s, len(s))  # 辻(2点ツジ), 1
s = '\U00008FBB\U000E0102'
print(s, len(s))  # 辻(1点ツジ), 2

色々調べたのですが、lenとかsubstringとか良い感じにカウントしたり、処理したりしてくれるライブラリ的なものも無い。。。

どーなんだろ。

まーいいや。ないなら作るしかあるまい。

という事で作った。

# 文字数カウント
def newLen(s):
    l = re.findall(
        '([\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])[\U000E0100-\U000E01EF]?', s)
    return len(l)

# substring
def newSubstring(s, st, ed):
    l = re.findall(
        '([\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])[\U000E0100-\U000E01EF]?', s)
    return ''.join(l[st:ed])

substringの方はかなり適当でエラー処理的なものとかガン無視。

重要なのは正規表現でサロゲとIVS考慮で一文字ずつの配列に変換して、

その配列の要素数やsliceでsubstringの代替をする感じ。

出来上がる配列は↓の感じ。

"あ\uE000\U00008205\U00008204\U000E0101\U00020C25\U0002B7CB\U000E0102"
↓
["あ","\uE000","\U00008205","\U00008204\U000E0101","\U00020C25","\U0002B7CB\U000E0102"]
※[普通の字 , 外字 , UNI , UNI+IVS , サロゲ , サロゲ+IVS]

ちなみに、javascriptでもほぼ同じロジックで同じこと出来るはず。

ただ、まともに検証してないので、今度ちゃんとやろ。