【Python】文字列の長さ(文字数・文字幅)を取得する方法

Python で文字列の長さ(文字数・文字幅)を取得する方法についての解説します。
文字列の長さを取得する
プログラミングでは、文字列の長さを取得して各種制御をすることがよくあります。
「文字列の長さ」と言う場合、文字数と文字幅という見方があります。文字数とは言葉の通り文字の数のことで、半角文字/全角文字に限らず 1 文字とカウントします。一方で、文字幅は全角は 2 文字、半角は 1 文字としてカウントしたものです。
Python で文字数を取得するには len、文字幅を取得するには、unicodedata.east_asian_width が使用できます。
この記事では、それぞれの使い方について紹介します。
len で文字数を取得する
Python の組み込み関数であるの len を使用することで、引数に指定したオブジェクトの長さや要素数を取得できます。引数には、シーケンス(文字列、バイト列、tuple、list、range 等)や (dict、set、frozenset 等) が指定できます。文字列限定の関数ではないので注意しましょう。
引数に文字列を指定した場合は、文字列の長さが取得できます。ここで長さと言っているのは文字数の事です。
# 文字列の文字数を取得する
temp_text = "Python文字列入門"
print(f"文字列の文字数:{len(temp_text)}")【実行結果】 文字列の文字数:11
例のように、len に対象文字列を渡すだけで簡単に文字数を取得できます。結果を見ても分かるように、バイト数ではなく文字数を取得します。マルチバイト文字である日本語でも 1 文字とカウントされます。
unicodedata.east_asian_width で文字幅を取得する
Python で文字列の文字幅を取得したい場合には、unicodedata.east_asian_width が使用できます。文字幅を取得できると、画面への文字表示幅を正確に制御できたり、CLI ツールにおける整列や位置の調整に役立ちます。
East Asian Width (東アジアの文字幅)とは、Unicode 標準の付属書11 (UAX#11) で Unicode 各文字の文字幅に関するヒントとなる特性を割り当てたものです。種類としては以下のようなものがあります。
| 区分 | 種類 | 内容 |
|---|---|---|
| 全角 | F | 全角英数等(Full width) |
| 全角 | W | 漢字や全角かな等(Wide) |
| 全角 | A | 特殊文字(Ambiguous) |
| 半角 | Na | 半角英数等(Narrow) |
| 半角 | H | 半角カタカナ等(Half width) |
| 半角 | N | アラビア文字などのその他(Neutral) |
unicodedata.east_asian_width は、引数に指定した文字に対する上記の種類を返却するため、その種類によって F、W、A は全角(2文字分)、NA、H、N は半角(1文字分)とすることで文字幅を計算できます。
unicodedata.east_asian_width で文字幅を取得するには以下のようにします。
import unicodedata
# 文字列の文字幅を取得する
temp_text = "Python(パイソン)文字列入門2021年☆"
length = 0
for ch in temp_text:
print(f"ch: {ch}, return:{unicodedata.east_asian_width(ch)}")
# 種類によってlengthを加算する
if unicodedata.east_asian_width(ch) in "FWA":
length += 2
else:
length += 1
print(f"文字列の文字幅:{length}")【実行結果】 ch: P, return:Na ch: y, return:Na ch: t, return:Na ch: h, return:Na ch: o, return:Na ch: n, return:Na ch: (, return:Na ch: ハ, return:H ch: ゚, return:H ch: イ, return:H ch: ソ, return:H ch: ン, return:H ch: ), return:Na ch: 文, return:W ch: 字, return:W ch: 列, return:W ch: 入, return:W ch: 門, return:W ch: 2, return:F ch: 0, return:F ch: 2, return:F ch: 1, return:F ch: 年, return:W ch: ☆, return:A 文字列の文字幅:35
例では、for 文で対象文字列から 1 文字ずつ取得し、east_asian_width に渡した際の返却値が "FWA" に含まれるかを in を使って判定しています。
"FWA" に含まれるのであれば、全角であるため length を +2、その他は半角なので length を +1 することで文字幅を計算しています。east_asian_width の返却値もあわせて出力していますが、半角や全角を表す種類の返却値となっています。
まとめ
Python で文字列の長さ(文字数・文字幅)を取得する方法についての解説しました。
文字の長さを取得するには、以下が使用できます。
- 文字数を取得する:
len - 文字幅を取得する:
unicodedata.east_asian_width
プログラミングの場面で、文字数か文字幅かどちらが必要かに応じてうまく使い分けるようにしてください。
上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。







