2011/12/23 - AndroidのJIS対応のバグ

Android版Weather TypingのランキングをAndroidで見ると名前の最後が文字化けすることがある問題を修正。Android JavaのURLEncoderがバグっていた。以前1つ対策したのだが,もう1つバグがあった模様。

URLEncoder.encode(s, "ISO-2022-JP")

のようにUnicodeからJISコードに変換した場合,以下の2点がバグっている。

  • 全角半角が混在した場合,全角半角の切り替えポイントで「%1B%28%42」が入らない
  • 最後に「%1B%28%42」が入るべき箇所が「%1B」になってしまう

なんていい加減な。それともJISがそういう規格なのかなあ。クライアント側を直しても既にアップロードしている人はバージョンアップしないといけなくなってしまうので,サーバ側で対策。しかもAndroidのバグがいきなり直った場合でもうまく動作しないといけない。結局以下のPerlコードで対策した。

if(($value =~ /%1B%24%42/) && !($value =~ /%1B%28%42/))
{
    $value =~ s/%1B([^%])/$1/g;
    $value =~ s/%1B%24%42((%[A-Fa-f0-9][A-Fa-f0-9])+)
              /%1B%24%42$1%1B%28%42/g;
}

JISの開始コードがあって終了コードが1つもない場合,「%1B」が単独で存在したら消しておき,全角部分をJIS開始コードとJIS終了コードで囲むという処理。一応テストはしたけどあらゆるパターンで大丈夫なのか自信がない。

コメントする