Concurrent Clean + 日本語 : 全角文字のカーソルポジションがずれる理由
日本語フォントを含むと、カーソルポジションがずれる原因は、下の部分にありそうです。つまり、「width s = (size s) * charWidth」の部分が、シングルバイト文字しか想定していないところですね。でも、ここを直すのは、ちょっとやり方を考える必要がありそうだな。
< EdVisualText.icl > tabStringWidth :: !Int ![String] !FontInfo -> Int tabStringWidth startX strings {tabSize, charWidth} # widths = map width strings = (virtualDraw widths startX) - startX where width s = (size s) * charWidth virtualDraw [] _ = 0 virtualDraw [w] x = x + w virtualDraw [w:ws] x = virtualDraw ws x` where x` = tabWidth * (inc ((x + w) / tabWidth)) tabSize` = max 1 tabSize // ensure sensible minimum tabWidth = tabSize` * charWidth
-
-
- -
-
でも、そもそも、プロポーショナルフォントを使っているわけではないのに、なぜ、ずれるのか?
-
-
- -
-
原因を見つけました。固定ピッチフォントで全角文字と半角文字を混在させたときに、全角文字のピッチがずれる原因が、マイクロソフトのホームページに載っていました。しかも、困ったことに、Windows XPから、この問題が解決されているので、Windows 2000以前とWindows XP以降では、異なる現象が発生してしまうのです。
http://www.microsoft.com/japan/msdn/windows/windowsxp/FixedPitchFont.asp
この現象は、3の倍数のポイント値のフォントでは発生しないとのことです。なので、Windows 2000でこの問題が発生したら、9ptもしくは12ptのフォントを使えば、とりあえず、問題は回避できそうです。
また、Windows XPでは、この問題は発生しないようです。