彷徨えるフジワラ

年がら年中さまよってます

MBCS 文字列の折り返し - その 2

文字の表示桁取得処理に関して気になることが。

dayflower 氏の実装では、unicodedata.east_asian_width() の戻り値が F/W/A のいずれかなら 2 桁とみなしているけど、Mercurial の colwidth()@encoding.pyでは F/W の場合だけ 2 桁とみなしている。

ふーむ、これってどういうこと?っつーか、'A' って何?と調べること暫し。

unicode の仕様によると:

A(mbiguous) 分類の場合、表示幅は言語設定に依存する。東アジア圏言語では 2 桁の場合があるが、言語設定が不明の場合は 1 桁とみなすべき。

ということらしい。つまり、dayflower 氏の実装は「日本語」環境を前提としていて、Mercurial 側の実装は「デフォルト」の挙動を採用しているのね。
'A' なケースが稀なのであれば、現状の Mercurial 側実装に倣えば良いけど、どうも丸付き数字とかローマ数字とかの文字(はてな日記では表示できないっぽい....)も 'A' 分類とみなされるらしい。うーん、個人的には使わない文字だけど、いかにも業務上必要になりそうな文字だよなぁ....

ざっと調べた限りでは、必ずしも全ての言語が 'A' 分類を 2 桁とみなすわけでは無いらしく、そうなると:

  1. locale 情報から得た言語設定(符号化設定?)から 'A' 分類の桁数を得る ⇒ 辞書を作成
  2. 環境変数等で明示的に指定

のどちらかで実現するしかないのかなぁ? > 'A' 分類の桁数取得

前者だと辞書の保守とかが面倒なことになりそうなので、とりあえずは後者でパッチを実装することに。

unicode 仕様では、'A' 分類を 2 桁とみなす言語は限られているようなニュアンスが感じられなくも無いけど、多分違うだろうなぁ > 貧弱な英語力

Python 上での上手い実現方法をご存知の方、情報ください。

あ、それと、同じ言語設定の 'A' 分類でも、文字によって桁数が違う、とかいうケースって無いのかな?そうなると、単純なテーブル引きじゃなくて、関数化しないと駄目だな > 桁数取得

※ 2010/05/17 追記

折角折り返し処理を事後差し替え可能にしてあるので、厳密な処理が必要な人は各自で折り返し処理を差し替えくれよ?ということで、'A' を常に2文字として扱うことになりそう。っていうか、そっちの方が確かに楽チン。