とりあえずメモ。
jaxenのサロゲート判定にバグがある。
今回見たのは、最新版の1.1.1。
org.jaxen.function.StringLengthFunction
を見ると、140行目あたりに
if (c >= 0xD800) {
とある。これは上位サロゲートを判定するものなのだが
正確には以下のようにしなければならない。
if (c >= 0xD800 && c <= 0xDBFF) {
これでうまくいく。
ちなみに今回これが発覚したのは、jaxanを使ってるPMDで
バグ報告を受けたから。
日本語名の変数を使ってるときに、パーサが日本語を
違法サロゲートだと誤判定してエラーになってしまう。
例えば「D」の文字はUnicodeで0xff24なので
if (c >= 0xD800) {
に引っかかってしまい次の文字が下位サロゲート(DC00?DFFF)じゃないと
「サロゲート違反だよ」ということでエラーになる。
にしても、下位サロゲートの処理は正しいのに
なんで上位サロゲートの処理だけ間違っているのか。
http://www.limy.org/program/articles/
ここに修正版の jaxen-1-1-1.jar を置いといた。
いずれjaxenにバグ報告しとかなきゃならないが
どうやらしばらく開発が止まってる様子。
再開してからにしよう。