Translate

2013年3月9日土曜日

Google Web Toolkitクライアント側でURLエンコード変換する

GWTクライアント側のみでURLEncode変換する場合
そう難しくはない。

GWTのクライアント側クラス
com.google.gwt.http.client.URL
を使えばよい。

String converted =
 URL.encode(original);

という具合。

通常のURLへのリダイレクト処理などは
これで大丈夫である。


しかし..なぜか

String converted =
 java.net.URLEncoder.encode(original, "UTF-8");


と全く同じ文字列にならない..

今回の実装はCloudStack APIを呼び出すURL生成を
サーバへ秘密キー送信せずに処理することなので
同じ結果にしないといけない。


いろいろ調べてみると
com.google.gwt.http.client.URL#encode()では
RFC3986にて定義されている予約文字を%から始まるUTF-8コードに
変換しないのだ。

しょうがないので
com.google.gwt.http.client.URL#encode()
で変換した文字列を以下の処理をかけ
予約後をすべてUTF-8コードに手動で変換して対応した。

public static final String[][] RF3986_RESERVED =
 {{":",    "%3A"},
 {"/",    "%2F"},
 {"?",    "%3F"},
 {"#",    "%23"},
 {"[",    "%5B"},
 {"]",    "%5D"},
 {"@",    "%40"},
 {"!",    "%21"},
 {"$",    "%24"},
 {"&",    "%26"},
 {"'",    "%27"},
 {"(",    "%28"},
 {")",    "%29"},
 {"*",    "%2A"},
 {"+",    "%2A"},
 {",",    "%2C"},
 {";",    "%3B"},
 {"=",    "%3D"}};

 private String replaceRFC3984ReservedChars(String org){
  StringBuffer ret = new StringBuffer();
  for(int pos=0;pos<org.length();pos++){
   String tgt = String.valueOf(org.charAt(pos));
   for(int index=0;index
    if(tgt.equals(RF3986_RESERVED[index][0])){
     tgt = RF3986_RESERVED[index][1];
     break;
    }
   }
   ret.append(tgt);
  }
  return ret.toString();
 }

これでなんとかURLencodeすることが出来た。

0 件のコメント:

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...