まず、以下の文字を見てみよう。
通常はありえない場合がいっぱいである。
これを見ると、どうやらあらゆる文字に濁点( ゛ )と半濁点( ゜ )を付けることができるようだ。
どうやったらこんな文字(?)を表示できるかを説明する前に、なぜこういうことを調べることになったかの経緯を説明しよう。
ブラウザ上やエディタ上では(a)のように見えていたのが、TkinterのTextウィジェット上では(b)の表示になってしまった。次は、’あ’からunicodeの順に40文字を表示したものである。
>>> for i in range(40):
... print(chr(ord('あ')+i),end='')
...
あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとど>>>
>>>
こんな感じで文字処理ができるのだが、詳細は省略する。
さて本題に戻ろう。
pythonで、濁点、半濁点を文字列の中に挿入してみよう。
>>> strlong = 'ハ'+'\u309a'+'ンタ'+'\u3099'+'か'+'\u3099'+'転んた'+'\u3099'+'。'
>>> strlong,len(strlong)
('ハ?ンタ?か?転んた?。', 12)
>>> import unicodedata
>>> strshort = unicodedata.normalize("NFC",strlong)
>>> strshort,len(strshort)
('パンダが転んだ。', 8)
>>>
#!/usr/bin/env python
import sys
import unicodedata
print( unicodedata.normalize("NFC", sys.stdin.read()), end='' )
実際、このフィルタで、大量のテキストファイルを”NFC”に変換している。
最初の変な濁点、半濁点がついた文字だが、次のようにして作った。
>>> ' '.join([ch+' '+ch+'\u3099'+' '+ch+'\u309a' for ch in 'さしすせそ']) 'さ さ? さ? し し? し? す す? す? せ せ? せ? そ そ? そ?' ?>>>

それ以外も、同様にして作ることができる。
しかし、どの様に表示されるかは、使用環境によって違うので、最初の図のようになるとは限らない。
濁点、半濁点が?に化けているが、これはこの原稿を書き込んでいるMovable TypeがNFD形式を認めず、間違えていると判断し?が表示されている訳である。