コーディングを支える技術p157のPythonの例をRubyで試す

こんな質問を頂きました。

『コーディングを支える技術』p157のPythonの例をRubyのpryとかで試すにはどうすればいいのだろう? pic.twitter.com/4uZXV9mJc4

https://twitter.com/maehrm/status/429954521947598850

端末のエンコーディングutf-8として、Ruby1.9ならこうすると試せます。

irb(main):044:0> puts %|\x1b$B$"$"$"|.force_encoding('iso-2022-jp').encode('utf-8')
あああ
=> nil

Pythonの文字列にはバイト列とユニコード列の2通りがあり、p157のPythonの例では、バイト列である'\x1b$B$"$"$"'をdecode('iso-2022-jp')で「iso-2022-jpだとみなしてユニコード文字列に変換」し、その後のprintで「端末のデフォルトエンコーディング(MacだったのでUTF-8)に変換して出力」が行われているわけです。

一方Rubyでは文字列は「バイト列+エンコーディング情報」という設計になっているので最初の%|\x1b$B$"$"$"|の段階で端末のエンコーディングから「この文字列はutf-8だ」と判断されています。そこでforce_encoding('iso-2022-jp')で「いや、それはutf-8ではなくiso-2022-jpだ」と教えています。ただ、これをputsするとiso-2022-jpなバイト列をそのまま端末に出してしまい化けてしまうので、改めてencode('utf-8')で端末と同じエンコーディングに変換しています。

    • -

拙著「コーディングを支える技術」の読者のみなさんから頂いたご質問・ご感想には、このような感じで補足記事を書いて行きたいと思っています。おきがねなくご質問・ご感想をお寄せ下さい。

拙著に関する他のエントリーは「「コーディングを支える技術」著者公式ページ」からたどれるようにします。