文字コードにUTF-8を採用している環境において、sprintfで%sで幅を指定して文字列を表示させて「あれ?」と思ったことはないだろうか。UTF-8では全角1文字のバイト数は3バイトになるので、sprintfで%8s等と指定しても全角文字があると意図した通りにならない。これは以下のコードで一応解決できる。 require "kconv" $KCODE = "UTF8" s = "日本語" print(sprintf("|%-*s|\n",8 + s.length - s.tosjis.length,s)) ただし、kconvによる文字コードの変換は割と不親切で、ちょっと特殊な文字だとinvalid encodingになるので、そのちょっと特殊な文字を扱いたい場合は予め削除する等の対策が必要となる。 UTF-8環境でsprintfで幅指定をしても日本語の文字列が正しく表示されない理由はこう