変えて変えて

Mac OS Xを鯖にした場合、文字コードの扱いの関係で『濁点・半濁点』付きの文字の扱いがおかしくなる話は以前書いたが、pythonで変換するスクリプトを組んでみた。

# -*- coding: shift-jis -*-
# test prog
import sys
import os
# Dictionary define
tb_dakuten = { \
u"が":u"か゛",u"ぎ":u"き゛",u"ぐ":u"く゛",u"げ":u"け゛",u"ご":u"こ゛", \
u"ざ":u"さ゛",u"じ":u"し゛",u"ず":u"す゛",u"ぜ":u"せ゛",u"ぞ":u"そ゛", \
u"だ":u"た゛",u"ぢ":u"ち゛",u"づ":u"つ゛",u"で":u"て゛",u"ど":u"と゛", \
u"ば":u"は゛",u"び":u"ひ゛",u"ぶ":u"ふ゛",u"べ":u"へ゛",u"ぼ":u"ほ゛", \
u"ぱ":u"は゜",u"ぴ":u"ひ゜",u"ぷ":u"ふ゜",u"ぺ":u"へ゜",u"ぽ":u"ほ゜", \
u"ガ":u"カ゛",u"ギ":u"キ゛",u"グ":u"ク゛",u"ゲ":u"ケ゛",u"ゴ":u"コ゛", \
u"ザ":u"サ゛",u"ジ":u"シ゛",u"ズ":u"ス゛",u"ゼ":u"セ゛",u"ゾ":u"ソ゛", \
u"ダ":u"タ゛",u"ヂ":u"チ゛",u"ヅ":u"ツ゛",u"デ":u"テ゛",u"ド":u"ト゛", \
u"バ":u"ハ゛",u"ビ":u"ヒ゛",u"ブ":u"フ゛",u"ベ":u"へ゛",u"ボ":u"ホ゛", \
u"パ":u"ハ゜",u"ピ":u"ヒ゜",u"プ":u"フ゜",u"ペ":u"ヘ゜",u"ポ":u"ホ゜", \
u"ヴ":u"ウ゛"
}
# main logic
c = ""
a = sys.argv[1]
bn = os.path.basename(a)
d = os.path.split(a)
b = unicode(bn,'shift-jis')
for ix in range(len(b)):
    try:
        c += tb_dakuten[b[ix]]
    except KeyError:
        c += b[ix]
f = d[0] + "\\" + c.encode('shift-jis')
os.rename(a,f)

ま、ようするに『ばびぶべぼ.txt』みたいなファイル名を『は゛ひ゛ふ゛へ゛ほ゛.txt』にすると言うことで…
日本語パス名が変換されてから、パス分離に気がついたのは内緒w

早速、修正w

メインロジック以下を、以下のように修正すると、複数ファイル対応(コマンドラインや、py2exeで作ったexeに複数dropの対応)

# main logic
for a in sys.argv[1:]:
    c = ""
    fl = 0
    bn = os.path.basename(a)
    d = os.path.split(a)
    b = unicode(bn,'shift-jis')
    for ix in range(len(b)):
        try:
            c += tb_dakuten[b[ix]]
            fl = 1
        except KeyError:
            c += b[ix]
    #変換発生なら、リネーム
    if fl == 1:
        try:
            f = d[0] + "\\" + c.encode('shift-jis')
            os.rename(a,f)
        except WindowsError:
            pass            #ファイルが無い場合は何もしない

OS X用にするには…

確認してないから自信ないけど、'shift-jis'の所を'utf-8'にすりゃあいいんでないかと…

逆変換

をやるには、えーと、

  • か行・さ行・た行の文字が来た場合は、次の文字が濁点なら濁点付き文字に変換。
  • は行の文字が来た場合は、次の文字が、濁点or半濁点なら、対応した文字に変換。
  • カタカナの時も同様に。
  • 『ウ゛』が来た場合は、ヴに変換

って言うロジックで良いと思う。ヒットした場合に、文字数を+2するのを忘れない様にw