マルチバイト文字にも対応しました。
ただし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)