Javaでは、これを変換したい。
https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type
これに:
https://mywebsite/docs/english/site/mybook.do&request_type
これが私のこれまでのところです:
class StringUTF
{
public static void main(String[] args)
{
try{
String url =
"https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" +
"%3Frequest_type%3D%26type%3Dprivate";
System.out.println(url+"Hello World!------->" +
new String(url.getBytes("UTF-8"),"ASCII"));
}
catch(Exception E){
}
}
}
しかし、うまくいきません。これらの%3A
および%2F
フォーマットとは何ですか?またそれらをどのように変換しますか?
これは、UTF-8やASCIIなどの文字エンコーディングとは関係ありません。あなたが持っている文字列は URLエンコードされた です。この種のエンコーディングは、文字エンコーディングとはまったく異なるものです。
このようなことを試してください:
try {
String result = Java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
// not going to happen - value came from JDK's own StandardCharsets
}
Java 10では、APIにCharset
の直接サポートが追加されました。つまり、UnsupportedEncodingExceptionを捕捉する必要はありません。
String result = Java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);
文字エンコーディング (UTF-8やASCIIなど)は、文字から生バイトへのマッピングを決定するものです。文字エンコーディングの概要については、 この記事 を参照してください。
あなたが手に入れた文字列はapplication/x-www-form-urlencoded
エンコーディングです。
URLDecoder を使用してJava文字列に変換します。
URLDecoder.decode( url, "UTF-8" );
これは答えられました before (この質問は最初でしたが):
「URLDecoderクラスは間違ったx-www-form-urlencodedデコードを行うので、これを行うにはJava.net.URIを使用する必要があります(名前にかかわらず、フォームデータ用です)」
基本的に:
String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type";
System.out.println(new Java.net.URI(url).getPath());
あなたを与えるでしょう:
https://mywebsite/docs/english/site/mybook.do?request_type
%3A
と%2F
はURLエンコード文字です。このJavaコードを使用して、それらを:
および/
に変換します。
String decoded = Java.net.URLDecoder.decode(url, "UTF-8");
try {
String result = URLDecoder.decode(urlString, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public String decodeString(String URL)
{
String urlString="";
try {
urlString = URLDecoder.decode(URL,"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
}
return urlString;
}
import Java.io.UnsupportedEncodingException;
import Java.net.URISyntaxException;
public class URLDecoding {
String decoded = "";
public String decodeMethod(String url) throws UnsupportedEncodingException
{
decoded = Java.net.URLDecoder.decode(url, "UTF-8");
return decoded;
//"You should use Java.net.URI to do this, as the URLDecoder class does x-www-form-urlencoded decoding which is wrong (despite the name, it's for form data)."
}
public String getPathMethod(String url) throws URISyntaxException
{
decoded = new Java.net.URI(url).getPath();
return decoded;
}
public static void main(String[] args) throws UnsupportedEncodingException, URISyntaxException
{
System.out.println(" Here is your Decoded url with decode method : "+ new URLDecoding().decodeMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type"));
System.out.println("Here is your Decoded url with getPath method : "+ new URLDecoding().getPathMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest"));
}
}
あなたは賢明にあなたの方法を選択することができます:)
URLDecoder.decode
を使うだけでは十分ではありません。例えば :
同じURLを複数回エンコードすることができるので、URLがそれ以上デコードされなくなるまでデコードする必要があります。たとえば、 "video%252Fmp4"は2回のエンコードの結果です。一度デコードすると、 "video%2Fmp4"が得られます。 URLをさらにデコードして "video/mp4"を取得する必要があります。これが結果です。
public static String decode(String url)
{
try {
String prevURL="";
String decodeURL=url;
while(!prevURL.equals(decodeURL))
{
prevURL=decodeURL;
decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
}
return decodeURL;
} catch (UnsupportedEncodingException e) {
return "Issue while decoding" +e.getMessage();
}
}