アットウィキロゴ

2018-02-02

Python on Macでファイルシステムから読んだ文字列幅を正しく数える


日本語は内部構造(Unicode)で3バイト幅,表示は2バイト幅ある。
この幅の違いを十分理解しておかないと,表示させたりカウントしたときに問題が起きてしまう。
今回は,ファイルシステムから読み込んだ文字列(ファイル名など)を表に埋め込んで表示するときに必要な文字列幅の計算方法を書く。

注意点

  1. Python上でUnicodeに変換する
    1. Pythonは文字列をStr型に変換して操作しようとする。
  2. 文字列カウントをバイト列でなく文字幅でする
    1. Pythonのstr.format()ではUnicode1文字は3バイトとして数えられてしまう。表示の時はこれは2文字が良い。
    2. これを実現するためにunicodedataモジュールを使う。
  3. 読み込んだUTF-8文字列をNFC形式(Windows形式)に変換する。
    1. この形式ならば濁点が一文字に数えられないので正しくカウントできる。MacのHFS+はNFD形式であり,濁点は1文字扱い。

import unicode data
 
def get_char_width(c):
    data = unicodedata.east_asian_width(c)
    if data == 'Na' or data == 'H':
        return 1
    return 2
 
def getStringWidth(string):
    # Transcode to Windows form (Dakuten is not one character. For Mac support.)                                                                                         
    string = unicodedata.normalize('NFC', string)
 
    width = 0
    for c in string:
        width += get_char_width(c)
    return width
 
def createBlankStr(count):
    str =''
    cur = len(str)
    while cur < count:
        str += ' '
        cur = len(str)
    return(str)
 
def setBlankPaddingForJapanese(str, width):
    padWidth = width - getStringWidth(str)
    str += createBlankStr(padWidth)
    return(str)
 
最終更新:2018年02月24日 07:39