Pythonで文字を全角か半角か判別する
固定幅フォントで表示させたいときに、文字数カウントで全角を2文字としてカウントしたいことがあります。Pythonでカウントしてみます。
目次
文字列の文字数をカウントする
文字列は文字のリストととらえて、len関数で長さをカウントできます。
>>> len('abcd')
4
>>> len('いろはに')
4
>>> len('クハ115')
5
文字の幅によらずに文字数をカウントできるので、便利ですね。
ところが、全角を2文字とカウントしたいことがままあります。例えば、コンソールに桁を合わせて出力したいとか、reStructuredTextのタイトルを示す文字列を作りたいとかですね。
unicodedata.east_asian_widthメソッド
import unicodedata
ret = unicodedata.east_asian_width(char)
変数 |
型 |
内容 |
---|---|---|
char |
char |
unicode文字。 |
ret |
str |
種類を示す文字列。 |
unicodedataモジュールのeast_asian_widthメソッドは、ユニコード文字の幅の種類を調べるメソッドです。
戻り値は文字列です。
種類 |
内容 |
---|---|
F |
全角。全角英数など。 |
H |
半角。半角カナなど。 |
W |
全角。漢字やかななど。 |
Na |
半角。半角英数など。 |
A |
曖昧。ギリシア文字など。 |
N |
中立。アラビア文字など。 |
全角と半角の判定例
試してみます。
まず全角英数です。
>>> import unicodedata
>>> unicodedata.east_asian_width('A')
'F'
>>> unicodedata.east_asian_width('1')
'F'
>>> unicodedata.east_asian_width(' ')
'F'
半角カナです。
>>> import unicodedata
>>> unicodedata.east_asian_width('イ')
'H'
>>> unicodedata.east_asian_width('。')
'H'
全角の漢字や「かな」です。
>>> import unicodedata
>>> unicodedata.east_asian_width('い')
'W'
>>> unicodedata.east_asian_width('漢')
'W'
>>> unicodedata.east_asian_width('・')
'W'
>>> unicodedata.east_asian_width('、')
'W'
>>> unicodedata.east_asian_width('。')
'W'
半角英数です。
>>> import unicodedata
>>> unicodedata.east_asian_width('1')
'Na'
>>> unicodedata.east_asian_width('a')
'Na'
>>> unicodedata.east_asian_width(' ')
'Na'
ギリシア文字です。
>>> import unicodedata
>>> unicodedata.east_asian_width('Π')
'A'
アラビア文字です。
>>> import unicodedata
>>> unicodedata.east_asian_width('ي')
'N'
全角半角の判定を利用した例
コンソールでテキストと同じ長さの線を引いてみます。
import unicodedata
t = '123いろはABCイロハ'
text_counter = 0
for c in t:
j = unicodedata.east_asian_width(c)
if 'F' == j:
text_counter = text_counter + 2
elif 'H' == j:
text_counter = text_counter + 1
elif 'W' == j:
text_counter = text_counter + 2
elif 'Na' == j:
text_counter = text_counter + 1
elif 'A' == j:
text_counter = text_counter + 2
else:
text_counter = text_counter + 1
print(t)
print('=' * text_counter)
east_asian_widthメソッドの戻り値をifで判定して、それに応じてカウンタを進めていくだけのコードです。
これを実行するとこうなります。
123いろはABCイロハ
==================
公開日
広告