#もしもし。
#こんにちは。
##Clojure(Java)で正規表現中に書ける文字の表記方法と文字列リテラル中に書ける文字の表記方法が違うのを知らなくてハマったという話です
#文字列はJavaの文字列そのままですよね? すなわちutf-16なんで、そもそもunicodeと離れた16進表記って不要だと思うんだけど,
#regex中の\xってのもunicode codepointなのかな?
#BMPの外だとサロゲートペアにしてくれるのか。
#user=> (.. "\u13042" length)
(.. "\u13042" length)
2
#BMP内だと一文字。
#user=> (.. "\u3042" length)
(.. "\u3042" length)
1
#\uの後の数字は4桁に限られてるようです。\u13042は \u1304 と 2 の2文字からなる文字列ですね。
#これはClojure上での話で、Javaで文字列リテラルを書く場合の桁数はわかりません
#同様に正規表現中の\xの後は2桁に限られていて、最初に戻りますが「それなら文字列中でも\xNNって書かせて欲しいなぁー」と思ってしまう。
#なんか歴史的な事情があるんでしょうけど
#あ、そうなるのかあ > \u1304 と 2
#考えてみれば不定長桁数だとデリミタが必要ですね。だからR6RSでも"\x3042;"となったわけで。
#サロゲートは別個に書かないとならないのかな。
#サロゲートペアはJava同様4桁のを二つ並べれば作れますね。(printf "%x" (.codePointAt "\uD867\uDE15" 0)) -> 29e15 (replでサロゲートペア文字を表示できなかったので符号位置を、、、)