decodeURI関数の動作でブラウザ判別

function getBrowserNameByDecodeURI() {
  //Firefox's decodeURI decodes percent-encoded U+FFFF and U+FFFE as U+FFFD
  if (decodeURI("%EF%BF%BF") == "\uFFFD") {
      try {
        //see http://d.hatena.ne.jp/masa141421356/20091009
        decodeURI("%F0%81%80%80");
        return "Firefox 3.5 or older";
      } catch (e) {
        return "Firefox 3.6";
      }
  }
  try {
    if (decodeURI("%C0%80")=="%C0%80") { //Opera's bug DSK-298518
      return "Opera 10.x or Older";
    }
    return "IE";
  } catch (e) {
    //ECMAScript5 requires to throw URIError for percent-encoded overlong UTF-8
    try {
      //ECMAScript5 also requires to throw URIError for
      //single surrogate code.
      //But, some browsers do not throw URIError.
      // see http://d.hatena.ne.jp/Constellation/20110530/1306759498
      if (decodeURI("%ED%A0%80")=="\uFFFD") {
          return "Opera 11.60";
      }
      return "Google Chrome (current)or Opera 11.0-11.50 or Firefox 4-7";
    } catch (e) {
      //If implementation of decodeURI is ECMAScript5 compliant, this code will be executed.
      return "Safari or Firefox 8(or later) or Google Chrome (after V8 issue 1415 fixed)"; 
    }
  }
}
2011/06/12 追記

id:Constellation さんからsurrogate code を使った判別方法を教えていただいたので判別部分を追加しました。

2011/10/27追記

サロゲートエリアの問題の修正パッチが入ったりしたのでその分を反映

2011/12/21追記

Opera11.60の動作が変わったのでその分を反æ˜