rubyの出力ってなんか気になる

カテゴリー :Ruby

最近rubyを触っていたという話題を出したのですがrubyの文字の出力で仕様が分からず混乱したのでまとめてメモしておきたいと思います.

2バイト文字と配列を用いたときの出力のメソッドに関するまとめです.

あと「SyntaxHighlighter Evolved」っていうWordPressプラグインの試運転です.w

rubyの出力メソッド

rubyのコンソール出力のメソッドはちょろっと調べた限りで

  • p:オブジェクトの内部状態を出力
  • print:文字列を出力
  • puts:文字列の主力と改行
  • printf:フォーマットに基づいて文字列を出力

これだけあります.

名前が違うだけあってそれぞれが違う動作をするようになっています.

1バイト文字の出力

1バイト文字出力を行った場合それぞれこのような結果が得られます.

p("Hello")
→Hello
print("Hello")
→Hello
puts("Hello")
→Hello
(改行)
printf("Hello")
→Hello

2バイト文字の出力

それでは2バイト文字を渡すとどうなるのでしょうか.

str = "こんにちは"

p(str)
→"\u3053\u3093\u306B\u3061\u306F"
print(str)
→こんにちは
puts(str)
→こんにちは
(改行)
printf(str)
→こんにちは

最初はpメソッドがprintと同じだと思い込んでいたので文字コードの指定がうまくいっていないのかと思いましたがそれは間違いで.pメソッドはオブジェクトの中身を出力するので上記のコードではstrの中身,つまりUnicodeそのまま出力する事になってしまいます.そのため””を含むstrの中身が出力されました.

2バイト文字列の配列の出力

rubyは出力のメソッドに配列を渡しても処理して配列の出力を行ってくれます.

しかし,処理が複雑であるためかなかかな思い通りの出力が得られず出力の仕様に振り回されました.

array =["おはよう","こんにちは","こんばんは"]

p(array)
→["\u304A\u306F\u3088\u3046", "\u3053\u3093\u306B\u3061\u306F", "\u3053\u3093\u3070\u3093\u306F"]
print(array)
→["\u304A\u306F\u3088\u3046", "\u3053\u3093\u306B\u3061\u306F", "\u3053\u3093\u3070\u3093\u306F"]
puts(array)
→おはよう
こんにちは
こんばんは
(改行)
printf(array)
→エラー

2バイト文字列を含む配列の場合,先ほどの2バイト文字列と同じようにprintで思い通りの文字列が得られると思いきやそうではなくprintではUnicodeが出力されてしまいます.

自分はこの現象ですごく頭を抱えたのですが実験した結果,仕様がこんなだったので仕方ないなと今は思っています.

rubyのデバッグの際は出力する場合は文字コードの指定だけでなく場面にあった出力メソッドの選択が重要です.