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でもほぼ同じロジックで同じこと出来るはず。
ただ、まともに検証してないので、今度ちゃんとやろ。