Hatena::ブログ(Diary)

西尾泰和のはてなダイアリー

2014-04-04

コーディングを支える技術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')で端末と同じエンコーディングに変換しています。

---

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

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/nishiohirokazu/20140404/1396622022