1. ホーム
  2. java

[解決済み] JavaScriptのencodeURIComponentと同じ出力を生成するJavaの同等物?

2022-10-26 11:39:28

質問

私は、引用符、スペース、および Unicode 文字を含む文字列をエンコードして、JavaScript と同じ出力を生成するものを考え出そうとして、Java コードのさまざまなビットを実験してきました。 encodeURIComponent 関数と同じ出力を生成します。

私の拷問テスト文字列は "A" B ± "

Firebugで以下のJavaScript文を入力すると。

encodeURIComponent('"A" B ± "');

-それから、私は得る。

"%22A%22%20B%20%C2%B1%20%22"

これが私の小さなテスト用Javaプログラムです。

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class EncodingTest
{
  public static void main(String[] args) throws UnsupportedEncodingException
  {
    String s = "\"A\" B ± \"";
    System.out.println("URLEncoder.encode returns "
      + URLEncoder.encode(s, "UTF-8"));

    System.out.println("getBytes returns "
      + new String(s.getBytes("UTF-8"), "ISO-8859-1"));
  }
}

-このプログラムは出力します。

URLEncoder.encodeは%22A%22+B+%C2%B1+%22を返します。
getBytesは"A" B ± "を返します。

惜しい、でもダメだ! Javaを使用してUTF-8文字列をエンコードする最良の方法は何でしょうか。 encodeURIComponent ?

EDITです。 私はJava 1.4を使っていますが、間もなくJava 5に移行します。

どのように解決するのですか?

実装の違いを見ると、なるほど。

にあるMDC encodeURIComponent() :

  • リテラル文字(正規表現)です。 [-a-zA-Z0-9._*~'()!]

Java 1.5.0 のドキュメント URLEncoder :

  • リテラル文字(正規表現)です。 [-a-zA-Z0-9._*]
  • スペース文字 " " はプラス記号に変換されます "+" .

ですから、基本的には、望ましい結果を得るために URLEncoder.encode(s, "UTF-8") を使って、後処理をします。

  • の出現を全て置き換えます。 "+""%20"
  • の出現をすべて置き換えます。 "%xx" のいずれかを表す [~'()!] をリテラルな対応するものに戻す