マルチバイト文字にも対応しました。

ただしUTF-8限定。行った方法が正しいのか分からないので行った方法を記しておく。

表示されるサイズの大きさの計算

string-lengthとstring-sizeを使った。

(string-length "aあ") ; => 2
(string-size "aあ") ; => 4

string-lengthは文字数をstring-sizeは文字列のバイト数を返してくれる手続き。
ここで、日本語の文字は全部3バイトだろうという仮定(良く調べていないのでこれが間違っている可能性がある)から
表示されるサイズの大きさを計算した。鶴亀算的な感じで。

(define (string-visible-size str) ;; utf-8
  (let ((len (string-length str))
        (size (string-size str)))
    (let ((full-width-n (/. (- size len) 2))
          (half-width-n (/. (- (* 3 len) size) 2)))
      (floor->exact
       (+ half-width-n (* 2 full-width-n))))))

一応簡単なテストは通っている。

(use gl.processing.util) ;; ここでstring-visible-sizeを定義している。
(use gauche.test)

(test-start "test...")
(test-module 'gl.processing.util)

;;(test-section "gl.processing.util")
(test-section "string-visible-size")
(test* "abc" 3 (string-visible-size "abc"))
(test* "abcあ" 5 (string-visible-size "abcあ"))
(test* "abcあいう" 9 (string-visible-size "abcあいう"))

(test-end)