2004 Nov 13th

ZenHan.py

アルファベット・数字・記号を半角・全角に変換するクラス

Pythonで日本語を扱っていて、アルファベット/数字/記号を全角から半角に、または半角から全角に変換したいことがあるので、クラスを作ってみました。長くなるのでコード自体は「続きを読む」で表示されるようにします。

使い方は、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
Leave a comment
Required fields are marked with *
search
calendar
Sep 2010
SunMonTueWedThuFriSat
   1234
567891011
12131415161718
19202122232425
2627282930  
archives
photos on flickr
www.flickr.com
bookmarks on delicious