はじめに
こんにちは、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使うこと自体が最近だと滅多にないから、いつこの状況に遭遇するかは不明だけど。