読者です 読者をやめる 読者になる 読者になる

CORDEA blog

Programming及びFedora21等のLinux OSのことが多めです。

Io で Unicode エスケープ形式から元に戻す

Io language で API を叩いていて、
"\u3042" とか出てきて元に戻す必要があったので調べた

結論

私の見た限りでは、一つ method 呼べばなんとかなるようには見えなかったので、以下のようにしてとりあえず解決した
簡単な方法あったら教えてください

str matchesOfRegex("u[a-f0-9]{4}") replace(x, ("0x" .. (x string exSlice(1))) toBase(10) asNumber asCharacter)

str は元の文字列
こんな感じ

Io> str := "\u3042\u3042\u3042\u3042\u3042\u3042"
==> u3042u3042u3042u3042u3042u3042
Io> str matchesOfRegex("u[a-f0-9]{4}") replace(x, ("0x" .. (x string exSlice(1))) toBase(10) asNumber asCharacter)
==> ああああああ

解説っぽいやつ

最初の方は不要だと思うので途中から

x string exSlice(1)

ここの x には "u3042" が入っているはずなので、slice で u を捨てる (replace でよかったかも)
そのあと、16 進数から 10 進数に変換したいので

"0x" .. ...

ここで "0x" を足して "0x3042" とし、
その上で 10 進数に変換 (toBase(10)) する

そうするとここで得られるのは "12354" という文字列 (Sequence)
このまま asCharacter に渡すと怒られるので、Number に変換する (asNumber)

asCharacter は渡された値に対して有効な UCS マッピングがあればそれにあたる文字を返してくれる
なので例えば先ほどの 12354 を渡すと "あ" が返ってくる

Io> 12354 asCharacter
==>