Pythonで文字数を正確にカウントする方法:半角1、全角2として計算


 

Pythonで文字列の長さを扱う際、半角文字と全角文字で幅が異なるため、見た目通りの文字数(幅)をカウントしたい場合があります。特にWebページのレイアウトやCLIツールでの表示調整において重要です。ここでは、半角文字を1、全角文字を2として文字幅をカウントする方法について解説します。

 

Unicodeにおける文字幅

 

Pythonの標準的なlen()関数は、文字列に含まれる文字の数を返します。しかし、これはUnicodeのコードポイント数であり、実際の表示幅とは異なります。例えば、「abcあいう」という文字列のlen()は6ですが、表示幅は半角3文字+全角3文字×2で9文字分となります。

 

文字幅をカウントする実装例

 

文字幅を正確にカウントするには、各文字が半角か全角かを判定し、それぞれに異なる重みを与える必要があります。以下に簡単な実装例を示します。

Python
 
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爆速講座