Groovyで文字と文字コードを相互変換する
文字列から文字コードを得る
コード
printf("%#x%n", (int)"a") printf("%#x%n", (int)"cba"[2]) printf("%#x%n", (int)"あ") printf("%#x%n", (int)"あいう"[0]) printf("%#x%n", (int)"あいう"[1])
文字コードから文字列を得る
コード
println new String((char)Integer.decode("0x61")) println new String((char)Integer.decode("0x3042")) println ((Character)Integer.decode("0x61")).toString() println ((Character)Integer.decode("0x3042")).toString()
実行結果
a あ a あ
こちらもマルチバイトもOK。
文字列全体を文字コードの配列に変換する
コード
"aiueo".each{c -> codes.add(sprintf("%#x", (int)c)) } println codes codes = [] "あいうえお".each{ c -> codes.add(sprintf("%#x", (int)c)) } println codes
実行結果
[0x61, 0x69, 0x75, 0x65, 0x6f] [0x3042, 0x3044, 0x3046, 0x3048, 0x304a]
マルチバイトもOK。
添削
def charset = 'us-ascii' println 'groovy'.getBytes(charset) // string to character codes println new String([103, 114, 111, 111, 118, 121] as byte[], charset) // character codes to string // groovier way that adding factory methods to convert character codes to string String.metaClass.static.fromBytes << { charsetName, List bytes -> new String(bytes.toArray() as byte[], charsetName) } String.metaClass.static.fromBytes << { charsetName, Object... bytes -> new String(bytes as byte[], charsetName) } println String.fromBytes(charset, [103, 114, 111, 111, 118, 121]) println String.fromBytes(charset, 103, 114, 111, 111, 118, 121)
添削歓迎
ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバック、はてブ、Twitter @orange_clover宛 で、お願いしまます。
実行環境
- OS:Windows XP
- Groovy Version: 1.8.0
- JVM: 1.6.0_26
『プログラミングGroovy 』に向けて、環境を1.8.0にした
過去の記事と比較するために、できるだけ同じ組み合わせ(Groovy:1.6.5,JVM:1.6.0_12)でやってたけど
最新で動かなきゃ意味ないからね。
Groovyの詳細についてはJavadocと以下の書籍を参考にしている。
Dierk Konig、Andrew Glover、Paul King、、Guillaume Laforge、Jon Skeet、杉浦 孝、櫻井 正樹、須江 信洋、関谷 和愛、佐野 徹郎、寺沢 尚史
Amazonでご確認ください。
問題自体は第2版のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。
Groovyイン・アクションを読むならあった方が便利かな。