#!/usr/bin/python
# -*- coding: euc-jp -*-
import sys
ASCII = 1
DIGIT = 2
KANA = 4
ALL = ASCII | DIGIT | KANA
# list of ZENKAKU characters
z_ascii = [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"¡¡"]
z_digit = [u"£°", u"£±", u"£²", u"£³", u"£´",
u"£µ", u"£¶", u"£·", u"£¸", u"£¹"]
z_kana = [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"¡¼"]
# list of HANKAKU characters
h_ascii = [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"!", 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" "]
h_digit = [u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9"]
h_kana = [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"ް"]
# maps of ascii
zh_ascii = {}
hz_ascii = {}
for i in range(len(z_ascii)):
zh_ascii[z_ascii[i]] = h_ascii[i]
hz_ascii[h_ascii[i]] = z_ascii[i]
del z_ascii, h_ascii
# maps of digit
zh_digit = {}
hz_digit = {}
for i in range(len(z_digit)):
zh_digit[z_digit[i]] = h_digit[i]
hz_digit[h_digit[i]] = z_digit[i]
del z_digit, h_digit
# maps of KANA
zh_kana = {}
hz_kana = {}
for i in range(len(z_kana)):
zh_kana[z_kana[i]] = h_kana[i]
hz_kana[h_kana[i]] = z_kana[i]
del z_kana, h_kana
# function check text
# argument and return: unicode string
def check_text(t):
if isinstance(t, basestring) and t:
return t
else:
sys.exit("Sorry... You must set UNICODE String.")
# function check convertion mode
# argument: integer
# return: integer between 0 to 7
def check_mode(m):
if isinstance(m, int) and m >= 0 and m <= 7:
return m
else:
sys.exit("Sorry... You set invalid mode.")
# function convert from ZENKAKU to HANKAKU
# argument and return: unicode string
def z2h(text="", mode=ALL, ignore=()):
converted = ""
text = check_text(text)
mode = check_mode(mode)
for c in text:
if c in ignore:
converted += c
elif mode in (1, 3, 5, 7) and zh_ascii.has_key(c):
converted += zh_ascii[c]
elif mode in (2, 3, 6, 7) and zh_digit.has_key(c):
converted += zh_digit[c]
elif mode in range(4, 8) and zh_kana.has_key(c):
converted += zh_kana[c]
else:
converted += c
return converted
# function convert from HANKAKU to ZENKAKU
# argument and return: unicode string
def h2z(text, mode=ALL, ignore=()):
converted = ""
text = check_text(text)
mode = check_mode(mode)
i = 0
size = len(text)
while i < size:
if i < size - 1:
if text[i:i+2] in ignore:
converted += text[i:i+2]
i += 2
continue
elif mode in range(4, 8) and hz_kana.has_key(text[i:i+2]): # DAKUON
converted += hz_kana[text[i:i+2]]
i += 2
continue
if text[i:i+1] in ignore:
converted += text[i:i+1]
elif mode in (1, 3, 5, 7) and hz_ascii.has_key(text[i:i+1]):
converted += hz_ascii[text[i:i+1]]
elif mode in (2, 3, 6, 7) and hz_digit.has_key(text[i:i+1]):
converted += hz_digit[text[i:i+1]]
elif mode in range(4, 8) and hz_kana.has_key(text[i:i+1]):
converted += hz_kana[text[i:i+1]]
else:
converted += text[i:i+1]
i += 1
return converted
if __name__ == "__main__":
teststr = unicode("abc£Ä£Å£Æ123£´£µ£¶Ž±Ž¶ŽÞŽ»¥À¥Ê¥Ð¥ÓŽÌŽßŽÍŽß", "euc-jp")
print "original:", teststr.encode("euc-jp")
print "h2z ascii only:", h2z(teststr, ASCII).encode("euc-jp")
print "h2z ascii and kana:", h2z(teststr, ASCII|KANA).encode("euc-jp")
print "z2h digit only:", z2h(teststr, DIGIT).encode("euc-jp")
print "z2h digit and kana:", z2h(teststr, DIGIT|KANA).encode("euc-jp")
print "z2h digit and kana, but '£µ':", z2h(teststr, DIGIT|KANA, (u"£µ")).encode("euc-jp")