Pythonで文字数を正確にカウントする方法:半角1、全角2として計算
Pythonで文字列の長さを扱う際、半角文字と全角文字で幅が異なるため、見た目通りの文字数(幅)をカウントしたい場合があります。特にWebページのレイアウトやCLIツールでの表示調整において重要です。ここでは、半角文字を1、全角文字を2として文字幅をカウントする方法について解説します。
Unicodeにおける文字幅
Pythonの標準的なlen()関数は、文字列に含まれる文字の数を返します。しかし、これはUnicodeのコードポイント数であり、実際の表示幅とは異なります。例えば、「abcあいう」という文字列のlen()は6ですが、表示幅は半角3文字+全角3文字×2で9文字分となります。
文字幅をカウントする実装例
文字幅を正確にカウントするには、各文字が半角か全角かを判定し、それぞれに異なる重みを与える必要があります。以下に簡単な実装例を示します。
import unicodedata
def get_char_width(char):
"""
文字の幅を返す関数。
半角文字は1、全角文字は2としてカウント。
"""
# East Asian Widthプロパティを取得
ea = unicodedata.east_asian_width(char)
if ea in ('F', 'W', 'A'): # 全角、広、曖昧
return 2
elif ea in ('H', 'Na', 'N'): # 半角、狭、非東アジア文字
return 1
return 1 # その他(制御文字など)
def get_string_width(s):
"""
文字列の表示幅を計算する関数。
"""
return sum(get_char_width(char) for char in s)
# 使用例
text1 = "Hello World"
text2 = "こんにちは世界"
text3 = "Python入門あいうえお"
print(f"'{text1}' の表示幅: {get_string_width(text1)}")
print(f"'{text2}' の表示幅: {get_string_width(text2)}")
print(f"'{text3}' の表示幅: {get_string_width(text3)}")
解説
-
unicodedata.east_asian_width(char): この関数は、Unicode文字の東アジアの幅プロパティを返します。このプロパティは、文字が表示される際に占める幅に関する情報を提供します。-
'F'(Fullwidth): 全角文字 -
'W'(Wide): 広幅文字(全角と同様に扱われることが多い) -
'A'(Ambiguous): 曖昧幅文字(文脈によって全角にも半角にもなる) -
'H'(Halfwidth): 半角文字 -
'Na'(Narrow): 狭幅文字(半角と同様に扱われることが多い) -
'N'(Neutral): 非東アジア文字(半角と同様に扱われることが多い)
-
この方法を用いることで、Pythonでより正確な文字幅のカウントが可能となり、見た目に合わせた文字列の処理を行う際に役立ちます。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座
