2004
Nov
13th
ZenHan.py
アルファベット・数字・記号を半角・全角に変換するクラス
Pythonで日本語を扱っていて、アルファベット/数字/記号を全角から半角に、または半角から全角に変換したいことがあるので、クラスを作ってみました。長くなるのでコード自体は「続きを読む」で表示されるようにします。
使い方は、importできるとこにおいて、
なお、このクラスを使うには、JapaneseCodecs(配布元: http://www.python.jp/Zope/download/JapaneseCodecs)がインストールされている必要があります。
使い方は、importできるとこにおいて、
import ZenHan zh = ZenHan.ZenHan("zen2han") print zh.convert("aあいうえおb")とすることで、「aあいうえおb」が出力されるという感じです。コンストラクトするときに、変換前の文字コードと変換後の文字コードを
zh = ZenHan.ZenHan("zen2han", "euc-jp", "sjis")のように指定することができます。
なお、このクラスを使うには、JapaneseCodecs(配布元: http://www.python.jp/Zope/download/JapaneseCodecs)がインストールされている必要があります。
コード
#!/usr/bin/python
# -*- coding: euc-jp -*-
INCODEC = "euc-jp" # 変換前の文字コードのデフォルト
OUTCODEC = "euc-jp" # 変換後の文字コードのデフォルト
import sys
class ZenHan:
convmap = {} # 変換用のマップ
incodec = INCODEC # 変換前の文字コード
outcodec = OUTCODEC # 変換後の文字コード
# 全角文字のリスト(Unicode)
zen = [u"A", u"B", u"C", u"D", u"E", u"F", u"G", u"H",
u"I", u"J", u"K", u"L", u"M", u"N", u"O", u"P",
u"Q", u"R", u"S", u"T", u"U", u"V", u"W", u"X",
u"Y", u"Z",
u"a", u"b", u"c", u"d", u"e", u"f", u"g", u"h",
u"i", u"j", u"k", u"l", u"m", u"n", u"o", u"p",
u"q", u"r", u"s", u"t", u"u", u"v", u"w", u"x",
u"y", u"z",
u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7",
u"8", u"9",
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" "]
# 半角文字のリスト(Unicode)
han = [u"A", u"B", u"C", u"D", u"E", u"F", u"G", u"H", u"I",
u"J", u"K", u"L", u"M", u"N", u"O", u"P", u"Q", u"R",
u"S", u"T", u"U", u"V", u"W", u"X", u"Y", u"Z",
u"a", u"b", u"c", u"d", u"e", u"f", u"g", u"h", u"i",
u"j", u"k", u"l", u"m", u"n", u"o", u"p", u"q", u"r",
u"s", u"t", u"u", u"v", u"w", u"x", u"y", u"z",
u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9",
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" "]
# JapaneseCodecsでサポートしている日本語文字コード
jpcodecnames = ["euc-jp", "ujis", "c.euc-jp", "python.euc-jp",
"shift_jis", "sjis", "c.shift_jis", "python.shift_jis",
"ms932", "windows-31j", "c.ms932", "iso-2022-jp",
"jis-7", "c.iso-2022-jp", "python.iso-2022-jp",
"iso-2022-jp-1", "c.iso-2022-jp-1",
"python.iso-2022-jp-1", "iso-2022-jp-ext",
"c.iso-2022-jp-ext", "python.iso-2022-jp-ext",
"jis-x-0201-roman", "jis-x-0201-katakana"]
# コンストラクタ
# * 第1引数: 「全角 -> 半角」のためのオブジェクトなら"zen2han"
# 「半角 -> 全角」のためのオブジェクトなら"han2zen"
# * 第2引数: 変換前の文字コード(なければデフォルト)
# * 第3引数: 変換後の文字コード(なければデフォルト)
def __init__(self, type, inc = INCODEC, outc = OUTCODEC):
if type == "zen2han":
for i in range(len(self.zen)):
self.convmap[self.zen[i]] = self.han[i]
elif type == "han2zen":
for i in range(len(self.han)):
self.convmap[self.han[i]] = self.zen[i]
else:
sys.exit(" Please give TYPE(zen2han or han2zen) to ZenHan Class.")
for codec in self.jpcodecnames:
if inc in (codec, "japanese." + codec):
self.incodec = inc
if outc in (codec, "japanese." + codec):
self.outcodec = outc
# 変換するメソッド
# * 第1引数: 変換対象の文字列
# * 返値: 返換後の文字列
def convert(self, text):
ret = ""
utext = unicode(text, self.incodec)
for c in utext:
if self.convmap.has_key(c):
ret += self.convmap[c]
else:
ret += c
return ret.encode(self.outcodec)
if __name__ == "__main__":
hz = ZenHan("han2zen")
print hz.convert("aあいうえおb")
zh = ZenHan("zen2han")
print zh.convert("aあいうえおb")
Posted by setomits at 09:00 |
Comments: 0