Pythonで文字を全角か半角か判別する

固定幅フォントで表示させたいときに、文字数カウントで全角を2文字としてカウントしたいことがあります。Pythonでカウントしてみます。

目次

  1. 文字列の文字数をカウントする
  2. unicodedata.east_asian_widthメソッド
  3. 全角と半角の判定例
  4. 全角半角の判定を利用した例

文字列の文字数をカウントする

文字列は文字のリストととらえて、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イロハ
==================

広告

Pythonの文字列処理カテゴリの投稿