Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

N進数リテラル混ざった文字列を配列に切り分ける場合、scanを使ってはいけない

リテラルが混在しているものから文字を一個ごとに切り出したいとします。
この場合、ぱっと思いつくのはscanですが……

"\u0012aga\x98ga987HH".scan(/.{1}/)
#=> ["\x12", "a", "g", "a", "枠", "a", "9", "8", "7", "H", "H"]

と、変に気を利かせて\x98gを"枠"と解釈して……くれたんですかね?(困惑*1

というわけで、文字の配列を得たい場合はunpackを使ったほうが良いです。
切り分け文字が思い出せなかったので、ここではmapにchrメソッド渡して処理しましたが……。

"\u0012aga\x98ga987HH".unpack("C*").map(&:chr)
#=> ["\x12", "a", "g", "a", "\x98", "g", "a", "9", "8", "7", "H", "H"]

*1:ちなみに、SJISだと0x9867なのだそうです。……0x67=>'g'だからね。仕方ないね。