bekliyorum
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
ÇIKTI:
Hello%20World
(20 boşluk için ASCII Hex kodudur)
Ancak, ne olsun:
Hello+World
Yanlış yöntemi mi kullanıyorum? Kullanmam gereken doğru yöntem nedir?
bekliyorum
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
ÇIKTI:
Hello%20World
(20 boşluk için ASCII Hex kodudur)
Ancak, ne olsun:
Hello+World
Yanlış yöntemi mi kullanıyorum? Kullanmam gereken doğru yöntem nedir?
Yanıtlar:
Bu beklendiği gibi davranır. URLEncoder
Uygular HTML formlarında nasıl encode URL'ler için HTML Özellikleri.
Gönderen javadocs :
Bu sınıf, bir String'i application / x-www-form-urlencoded MIME biçimine dönüştürmek için statik yöntemler içerir.
Uygulama / x-www-form-urlencoded
Bu içerik türüyle gönderilen formlar aşağıdaki gibi kodlanmalıdır:
- Kontrol adları ve değerleri kaçtı. Boşluk karakterleri `` + '' ile değiştirilir
Değiştirmeniz gerekecek, örneğin:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("+", "%20"));
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Bir alan, %20
URL'lerde ve +
gönderilen formlarda (içerik türü application / x-www-form-urlencoded) olarak kodlanır . İlkine ihtiyacınız var.
Guava'yı kullanma :
dependencies {
compile 'com.google.guava:guava:23.0'
// or, for Android:
compile 'com.google.guava:guava:23.0-android'
}
UrlEscapers'ı kullanabilirsiniz :
String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);
String.replace kullanmayın, bu yalnızca alanı kodlar. Bunun yerine bir kütüphane kullanın.
Bu sınıf yerine application/x-www-form-urlencoded
nedenle değiştirilmesi yerine yüzde kodlamaya göre kodlayan tipi ile
+
doğru bir davranıştır.
Javadoc'tan:
Bir Dizeyi kodlarken aşağıdaki kurallar geçerlidir:
- "A" - "z", "A" - "Z" ve "0" - "9" arasındaki alfasayısal karakterler aynı kalır.
- ".", "-", "*" ve "_" özel karakterleri aynı kalır.
- "" Boşluk karakteri, artı işaretine "+" dönüştürülür.
- Diğer tüm karakterler güvensizdir ve önce bazı kodlama şeması kullanılarak bir veya daha fazla bayta dönüştürülür. Daha sonra her bayt, 3 karakterlik "% xy" dizesi ile temsil edilir; burada xy, baytın iki basamaklı onaltılı gösterimidir. Kullanılması önerilen kodlama şeması UTF-8'dir. Bununla birlikte, uyumluluk nedeniyle, bir kodlama belirtilmezse, platformun varsayılan kodlaması kullanılır.
url
mekan olarak yorumlanmalıdır %20
. Yani yapmamız gerek url.replaceAll("\\+", "%20")
? Ve eğer javascript ise, escape
fonksiyonu kullanmamalıyız . Kullanın encodeURI
veya encodeURIComponent
bunun yerine. Bende böyle düşünmüştüm.
Sorgu parametrelerini kodlama
org.apache.commons.httpclient.util.URIUtil
URIUtil.encodeQuery(input);
VEYA URI içindeki karakterlerden kaçmak istiyorsanız
public static String escapeURIPathParam(String input) {
StringBuilder resultStr = new StringBuilder();
for (char ch : input.toCharArray()) {
if (isUnsafe(ch)) {
resultStr.append('%');
resultStr.append(toHex(ch / 16));
resultStr.append(toHex(ch % 16));
} else{
resultStr.append(ch);
}
}
return resultStr.toString();
}
private static char toHex(int ch) {
return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnsafe(char ch) {
if (ch > 128 || ch < 0)
return true;
return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}
org.apache.commons.httpclient.util.URIUtil
sorunu çözmenin en etkili yolu gibi görünüyor!
Hello+World
tarayıcının application/x-www-form-urlencoded
bir GET
istek için form verilerini ( ) nasıl kodlayacağıdır ve bu, bir URI'nin sorgu kısmı için genellikle kabul edilen formdur.
http://host/path/?message=Hello+World
Bu isteği bir Java sunucu uygulamasına gönderirseniz, sunucu uygulaması parametre değerinin kodunu çözecektir. Genellikle burada sorun olan tek zaman kodlamanın eşleşmemesi.
Kesin olarak, HTTP veya URI özelliklerinde, sorgu parçasının application/x-www-form-urlencoded
anahtar / değer çiftleri kullanılarak kodlanmasına gerek yoktur ; sorgu bölümünün sadece web sunucusunun kabul ettiği biçimde olması gerekir. Uygulamada, bunun bir sorun olması pek olası değildir.
Bu kodlamanın URI'nin diğer bölümleri için kullanılması genellikle yanlış olur (örneğin yol). Bu durumda, kodlama şemasını RFC 3986'da açıklandığı gibi kullanmalısınız .
http://host/Hello%20World
Daha burada .
Diğer cevaplar ya manuel dize değiştirme, aslında HTML formatını kodlayan URLEncoder , Apache'nin terk edilmiş URIUtil'i ya da Guava UrlEscapers'ı kullanıyor . Sonuncusu iyidir, ancak bir kod çözücü sağlamaz.
Apache Commons Lang, rfc3986 URL biçimine göre kodlayan ve kod çözen URLCodec'i sağlar .
String encoded = new URLCodec().encode(str);
String decoded = new URLCodec().decode(str);
Zaten bahar kullanıyorsanız, ayrıca kullanmayı seçebilirler onun UriUtils sınıfını da .
"+" doğrudur. Gerçekten% 20'ye ihtiyacınız varsa, daha sonra Plusses'i kendiniz değiştirin.
+
Orijinal metindeki bir karakterin olarak kodlanması gerekir %2B
.
+
bağlamı bilmeden bunun doğru olduğunu söylemek en azından bilgiçlik taslayan. Downvoted. + Veya% 20'nin ne zaman kullanılacağını öğrenmek için diğer yanıtları okuyun.
Sadece Android ile de bu mücadele, Uri.encode (String, String) tökezlemeyi başardı android ise belirli (android.net.Uri) için bazı yararlı olabilir.
statik Dize kodlaması (Dize s, Dize izin ver)
Bu benim için çalıştı
org.apache.catalina.util.URLEncoder ul = new org.apache.catalina.util.URLEncoder().encode("MY URL");
Oldukça eski olmasına rağmen, yine de hızlı bir yanıt:
Bahar UriUtils sağlar - bununla nasıl kodlanacağını ve hangi bölümün bir URI'den ilişkili olduğunu belirtebilirsiniz, ör.
encodePathSegment
encodePort
encodeFragment
encodeUriVariables
....
Onları kullanıyorum çünkü zaten Spring kullanıyoruz, yani ek kütüphaneye gerek yok!
Java.net.URI sınıfına bakın.
Yanlış yöntemi mi kullanıyorum? Kullanmam gereken doğru yöntem nedir?
Evet, bu yöntem java.net.URLEncoder.encode "(" ) özelliğine ( kaynağa ) göre "%" değerine dönüştürülmek için yapılmadı .
"" Boşluk karakteri, artı işaretine "+" dönüştürülür.
Bu doğru yöntem olmasa bile, bunu şu şekilde değiştirebilirsiniz: System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
iyi günler =).
URLEncoder.encode
) bir yöntem kullanmanızı ve replaceAll
yalnızca bu özel durumda çalışacak şekilde yama eklemenizi öneririz. Bunun yerine doğru sınıfı ve yöntemi kullanın, diğer yanıtlara bakın.
KULLANIM MyUrlEncode.URLencoding (string url, dize enc) sorunu ele almak
public class MyUrlEncode {
static BitSet dontNeedEncoding = null;
static final int caseDiff = ('a' - 'A');
static {
dontNeedEncoding = new BitSet(256);
int i;
for (i = 'a'; i <= 'z'; i++) {
dontNeedEncoding.set(i);
}
for (i = 'A'; i <= 'Z'; i++) {
dontNeedEncoding.set(i);
}
for (i = '0'; i <= '9'; i++) {
dontNeedEncoding.set(i);
}
dontNeedEncoding.set('-');
dontNeedEncoding.set('_');
dontNeedEncoding.set('.');
dontNeedEncoding.set('*');
dontNeedEncoding.set('&');
dontNeedEncoding.set('=');
}
public static String char2Unicode(char c) {
if(dontNeedEncoding.get(c)) {
return String.valueOf(c);
}
StringBuffer resultBuffer = new StringBuffer();
resultBuffer.append("%");
char ch = Character.forDigit((c >> 4) & 0xF, 16);
if (Character.isLetter(ch)) {
ch -= caseDiff;
}
resultBuffer.append(ch);
ch = Character.forDigit(c & 0xF, 16);
if (Character.isLetter(ch)) {
ch -= caseDiff;
}
resultBuffer.append(ch);
return resultBuffer.toString();
}
private static String URLEncoding(String url,String enc) throws UnsupportedEncodingException {
StringBuffer stringBuffer = new StringBuffer();
if(!dontNeedEncoding.get('/')) {
dontNeedEncoding.set('/');
}
if(!dontNeedEncoding.get(':')) {
dontNeedEncoding.set(':');
}
byte [] buff = url.getBytes(enc);
for (int i = 0; i < buff.length; i++) {
stringBuffer.append(char2Unicode((char)buff[i]));
}
return stringBuffer.toString();
}
private static String URIEncoding(String uri , String enc) throws UnsupportedEncodingException { //对请求参数进行编码
StringBuffer stringBuffer = new StringBuffer();
if(dontNeedEncoding.get('/')) {
dontNeedEncoding.clear('/');
}
if(dontNeedEncoding.get(':')) {
dontNeedEncoding.clear(':');
}
byte [] buff = uri.getBytes(enc);
for (int i = 0; i < buff.length; i++) {
stringBuffer.append(char2Unicode((char)buff[i]));
}
return stringBuffer.toString();
}
public static String URLencoding(String url , String enc) throws UnsupportedEncodingException {
int index = url.indexOf('?');
StringBuffer result = new StringBuffer();
if(index == -1) {
result.append(URLEncoding(url, enc));
}else {
result.append(URLEncoding(url.substring(0 , index),enc));
result.append("?");
result.append(URIEncoding(url.substring(index+1),enc));
}
return result.toString();
}
}
ISO-8859-1
URLEncoder için karakter kümesi " " kullan