monthly gimite

試験運用中。

printfは$KCODEの影響を受ける

ハマったのでメモ。printfで$KCODEと一致しないマルチバイト文字列を出力しようとすると文字化けます(この場合だと最後の1バイトが消えるみたい)。

require "kconv"
s= "日本語".toeuc()

$KCODE= "e"
puts(s)           #=> 日本語
printf("%s\n", s) #=> 日本語

$KCODE= "u"
puts(s)           #=> 日本語
printf("%s\n", s) #=> 日本ク

sprintfとか%とかでも同様。putsは問題無し。たぶん桁数指定(%5sとか)の処理の関係でマルチバイト文字を認識してるのかな…。

まあ、妙なことをしちゃいけないということですね。

2006/11/28 追記: バグだったらしく、1.9では修正済み、1.8でもCVS上では修正されたそうです。ただし

でも、sprintf全般を言えば$KCODEの影響を全く受けないわけにはいかないはずです。

とのこと。