YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

全角文字の文字幅を取得する

はじめに

こんにちは、Python界の情弱です。Pythonで文字の長さではなく、文字幅を取得したい場合はどうしたらいいのかな、という話。最近は日本語はUTF-8で処理することがほとんどですが、UTF-8は1文字3バイトだったりしてlen()を使うとおかしな長さになったりして、うぼあああ、とかなってたら清水川先生と世界の小宮氏 (@tk0miya)がマッハで教えてくれました。
なおこの記事は引用部のコードはAPL2.0

unicodedataモジュール

Unicodeをぶち込めば文字幅が返ってくるeast_asian_width超便利です。世界の小宮氏の当該のコードはつぎのとおり。便利すぎる。

def string_width(string):
    u"""
    Measure rendering width of string.
    Count ZENKAKU-character as 2-point and non ZENKAKU-character as 1-point

    >>> string_width(u"abc")
    3
    >>> string_width(u"あいう")
    6
    >>> string_width(u"あいc")
    5
    """
    width = 0
    for c in string:
        char_width = unicodedata.east_asian_width(c)
        if char_width in u"WFA":
            width += 2
        else:
            width += 1

    return width

Shift JISならlen()でいい

ワールドといぷーマスター、id:atsuoishimoto 師曰く

[5/11/12 11:24:24 AM] atsuo ishimoto: 「マルチバイト文字」ってSJISとかならlen(string)になるよ

そりゃそうだ。全角は全部2バイトなんだから。自分の書くコードがWindows環境ほとんど想定してない上に、Shift JIS使うこと自体が最近だと滅多にないから、いつこの状況に遭遇するかは不明だけど。