文字コード表を使用せず、計算だけで行います。
次の文字は、変換しません。
濁点、合成用 [゙ ]→ '\u3099' 半濁点、合成用 [゚ ]→ '\u309a' 濁点 [゛] → '\u309b' 半濁点 [゛] → '\u309c' よりの合略仮名 [ゟ] → '\u309f' 中点 [・] → '\u30fb' 長音 [ー] → '\u30fc' ワに濁点 [ヷ] → '\u30f7' ヰに濁点 [ヸ] → '\u30f8' ヱに濁点 [ヹ] → '\u30f9' ヲに濁点 [ヺ] → '\u30fa'
以下の記号文字は、平仮名とカタカナで対応が存在するので変換します
繰り返し記号(平仮名) [ゝ]→ '\u309d' 12445 繰り返し記号(平仮名) [ゞ]→ '\u309e' 12446 繰り返し記号(カタカナ) [ヽ]→ '\u30fd' 12541 繰り返し記号(カタカナ) [ヾ]→ '\u30fe' 12542
全角平仮名→全角カタカナ変換
def hiraToKata(target): return ''.join([chr(n+96) if (12352 < n and n < 12439) or n==12445 or n==12446 else chr(n) for n in [ord(c) for c in target]])
全角カタカナ→全角平仮名変換
def kataToHira(target): return ''.join([chr(n-96) if (12448 < n and n < 12535) or n==12541 or n==12542 else chr(n) for n in [ord(c) for c in target]])
平仮名、カタカナ、それぞれ以下のように文字コードが存在します。
>>> from functools import reduce >>> reduce(lambda r, t: r + chr(t), range(12353, 12448), '') 'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんヴ??\u3097\u3098??゛゜ゝゞ?' >>> reduce(lambda r,t:r+chr(t),range(12449,12543),'') 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ????・ーヽヾ'
文字列、h. k に対して変換を実行します
h = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゙゚゛゜ゝゞゟ" k = "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾ" print( hiraToKata(h) ) print( kataToHira(k) )
結果
ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ゙゚゛゜ヽヾゟ ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖヷヸヹヺ・ーゝゞ