urlencode vs rawurlencode?


380

Bir değişkeni kullanarak bir URL oluşturmak istiyorsanız dizeyi kodlamak için iki seçeneğim var. urlencode()ve rawurlencode().

Farklılıklar tam olarak nedir ve hangileri tercih edilir?


1
Gerçekten birini seçmek için bazı nedenleri görmek istiyorum (örneğin biri ya da diğeri ile karşılaşılabilecek sorunlar), ben (ve başkalarının bekliyoruz) sadece birini seçmek ve sonsuza dek kullanmak mümkün istiyorum en azından yaygara, bu yüzden bu soruya bir ödül kazandım.
Kzqai

29
@Tchalvak: Sadece birini seçmek istiyorsanız seçin rawurlencode. Olarak kodlanmış alanlar verildiğinde %20boğulan bir sisteme nadiren +rastlanırken, olarak kodlanan alanları boğucu sistemler daha yaygındır.
Anomie

Yanıtlar:


326

Amacınıza bağlı olacaktır. Diğer sistemlerle birlikte çalışabilirlik önemliyse, ham kodun gitmenin yolu olduğu görülmektedir. Tek istisna, sorgu dizesinin% 20 yerine + olarak kodlanmış alanların form kodlama stilini izlemesini bekleyen eski sistemlerdir (bu durumda urlencode'a ihtiyacınız vardır).

rawurlencode PHP 5.3.0'dan önce RFC 1738 ve daha sonra RFC 3986'yı izler (bkz. http://us2.php.net/manual/en/function.rawurlencode.php )

-_. ~ Dışındaki tüm alfasayısal olmayan karakterlerin yerine yüzde (%) işareti ve ardından iki onaltılık basamak yerleştirilmiş bir dize döndürür. Bu, değişmez karakterlerin özel URL sınırlayıcıları olarak yorumlanmasını önlemek ve URL'lerin karakter dönüşümlü iletim ortamı (bazı e-posta sistemleri gibi) tarafından yönetilmesini önlemek için »RFC 3986'da açıklanan kodlamadır.

Php 5.3'ten önceki rawurlencode ~, RFC 1738'e göre tilde karakterini ( ) kodladı.

urlencode, boşlukları artı işaretleri olarak kodlar ( %20rawurlencode'da olduğu gibi değil ) (bkz. http://us2.php.net/manual/en/function.urlencode.php )

-_ dışında alfasayısal olmayan tüm karakterlerin bulunduğu bir dize döndürür. bir yüzde (%) işareti ve ardından iki onaltılık basamak ve artı (+) işareti olarak kodlanan boşluklarla değiştirildi. WWW formundan gönderilen verilerin kodlandığı şekilde kodlanır, yani application / x-www-form-urlencoded media tipindekiyle aynı şekilde kodlanır. Bu, tarihsel nedenlerden dolayı boşlukların artı (+) işaretleri olarak kodlanması bakımından »RFC 3986 kodlamasından (bkz. Rawurlencode ()) farklıdır.

Bu, RFC 1866'daki / x-www-form-urlencoded uygulamasının tanımına karşılık gelir .

Ek Okuma:

Ayrıca tartışmayı http://bytes.com/groups/php/5624-urlencode-vs-rawurlencode adresinde de görmek isteyebilirsiniz .

Ayrıca, RFC 2396 bir göz atmaya değer. RFC 2396 geçerli URI sözdizimini tanımlar. İlgilendiğimiz ana bölüm 3.4 Sorgu Bileşeni'nden:

Bir sorgu bileşeninde karakterler ayrılmıştır.";", "/", "?", ":", "@",
"&", "=", "+", ",", and "$"

Gördüğünüz gibi +, sorgu dizesinde ayrılmış bir karakterdir ve bu nedenle RFC 3986'ya göre (rawurlencode'da olduğu gibi) kodlanması gerekir.


27
Peki hangisi tercih edilir?
Gary Willoughby

79
rawurlencode. bu durumda standart ile gidin. urlencode sadece eski kullanım için tutulur
Jonathan Fingland

2
Çok teşekkürler, thats ne düşündüm, ben kod çok güncelleme başlamadan önce sadece ikinci bir görüş istedim.
Gary Willoughby

3
Boşlukları artı işaretleri olarak değil% 20s olarak
kodlamayan rawurlencode

2
@Pindatjuh: Alıntıladığınız bölüm Tek istisna, sorgu dizesinin,% 20 yerine + olarak kodlanmış alanların biçim kodlama stilini izlemesini bekleyen eski sistemlerdir (bu durumda urlencode'a ihtiyacınız vardır) , rawurlencode'un çoğu durum için doğru olduğu anlamına gelir , bazı sistemler boşlukların + (artı işareti) olarak kodlanmasını bekler. Bu tür sistemler için urlencode daha iyi bir seçimdir.
Jonathan Fingland

213

İspat PHP'nin kaynak kodundadır.

Gelecekte istediğiniz zaman bu tür şeyleri kendi kendinize nasıl bulacağınız konusunda hızlı bir süreçten geçeceğim. Benimle birlikte, gözden geçirebileceğiniz bir sürü C kaynak kodu olacak (açıklarım). Bazı C fırçalamak istiyorsanız, başlamak için iyi bir yer bizim SO wiki .

Kaynak indirin (veya çevrimiçi göz atmak için http://lxr.php.net/ kullanın), işlev adı için tüm dosyaları grep, böyle bir şey bulacaksınız:

PHP 5.3.6 (en son yazma sırasında) url.c dosyasındaki yerel C kodundaki iki işlevi açıklar .

RawUrlEncode ()

PHP_FUNCTION(rawurlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_raw_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

UrlEncode ()

PHP_FUNCTION(urlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

Tamam, burada farklı olan ne?

Her ikisi de esasen sırasıyla iki farklı dahili işlevi çağırır : php_raw_url_encode ve php_url_encode

O halde git bu fonksiyonları ara!

Hadi php_raw_url_encode'a bakalım

PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
{
    register int x, y;
    unsigned char *str;

    str = (unsigned char *) safe_emalloc(3, len, 1);
    for (x = 0, y = 0; len--; x++, y++) {
        str[y] = (unsigned char) s[x];
#ifndef CHARSET_EBCDIC
        if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
            (str[y] < 'A' && str[y] > '9') ||
            (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
            (str[y] > 'z' && str[y] != '~')) {
            str[y++] = '%';
            str[y++] = hexchars[(unsigned char) s[x] >> 4];
            str[y] = hexchars[(unsigned char) s[x] & 15];
#else /*CHARSET_EBCDIC*/
        if (!isalnum(str[y]) && strchr("_-.~", str[y]) != NULL) {
            str[y++] = '%';
            str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
            str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
#endif /*CHARSET_EBCDIC*/
        }
    }
    str[y] = '\0';
    if (new_length) {
        *new_length = y;
    }
    return ((char *) str);
}

Ve tabii ki, php_url_encode:

PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
{
    register unsigned char c;
    unsigned char *to, *start;
    unsigned char const *from, *end;

    from = (unsigned char *)s;
    end = (unsigned char *)s + len;
    start = to = (unsigned char *) safe_emalloc(3, len, 1);

    while (from < end) {
        c = *from++;

        if (c == ' ') {
            *to++ = '+';
#ifndef CHARSET_EBCDIC
        } else if ((c < '0' && c != '-' && c != '.') ||
                   (c < 'A' && c > '9') ||
                   (c > 'Z' && c < 'a' && c != '_') ||
                   (c > 'z')) {
            to[0] = '%';
            to[1] = hexchars[c >> 4];
            to[2] = hexchars[c & 15];
            to += 3;
#else /*CHARSET_EBCDIC*/
        } else if (!isalnum(c) && strchr("_-.", c) == NULL) {
            /* Allow only alphanumeric chars and '_', '-', '.'; escape the rest */
            to[0] = '%';
            to[1] = hexchars[os_toascii[c] >> 4];
            to[2] = hexchars[os_toascii[c] & 15];
            to += 3;
#endif /*CHARSET_EBCDIC*/
        } else {
            *to++ = c;
        }
    }
    *to = 0;
    if (new_length) {
        *new_length = to - start;
    }
    return (char *) start;
}

İlerlemeden önce kısa bir bilgi birikimi olan EBCDIC, ASCII'ye benzeyen başka bir karakter seti , ancak toplam bir rakip. PHP her ikisiyle de uğraşmaya çalışır. Ama temel olarak, bu byte EBCDIC 0x4c byte LASCII'de değil, aslında bir <. Burada karışıklığı gördüğünüze eminim.

Web sunucusu tanımladıysa, bu işlevlerin her ikisi de EBCDIC'yi yönetir.

Ayrıca, her ikisi de hexcharsbazı değerleri almak için karakter dizisi (think string type) araması kullanır , dizi şöyle açıklanır:

/* rfc1738:

   ...The characters ";",
   "/", "?", ":", "@", "=" and "&" are the characters which may be
   reserved for special meaning within a scheme...

   ...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
   reserved characters used for their reserved purposes may be used
   unencoded within a URL...

   For added safety, we only leave -_. unencoded.
 */

static unsigned char hexchars[] = "0123456789ABCDEF";

Bunun ötesinde, fonksiyonlar gerçekten farklı ve ASCII ve EBCDIC'de bunları açıklayacağım.

ASCII'deki farklılıklar:

UrlEncode:

  • Giriş dizesinin başlangıç ​​/ bitiş uzunluğunu hesaplar, bellek ayırır
  • Bir while döngüsü boyunca yürür, dizenin sonuna ulaşana kadar artar
  • Şimdiki karakteri yakalar
  • Karakter ASCII Char 0x20 (yani, bir "boşluk") değerine eşitse +, çıkış dizesine bir işaret ekleyin .
  • Bir boşluk değilse ve aynı zamanda alfasayısal ( isalnum(c)) değilse ve ayrıca ve , veya karakter değilse _, 0 dizisi konumuna bir işaret çıkarırsak , dizi için arama yapmak için diziye bir dizi ararız ( (mevcut karakter) anahtarı için Apache'den char'ı onaltılık koda çeviren bir dizi ), daha sonra sağa doğru 4'e doğru kaydırırız, bu değeri 1 karakterine atarız ve 2 konumuna aynı formu atarız, ancak önceden oluşturmamız dışında mantıksal ve değerin 15 (0xF) olup olmadığını görmek ve bu durumda 1, aksi takdirde 0 değerini döndürmek. Sonunda, kodlanmış bir şey elde edersiniz.-.%hexcharsos_toasciic
  • Sonunda bir boşluk değil, alfasayısal veya _-.karakterlerden biri, tam olarak ne olduğunu verir.

RAWURLENCODE:

  • Dize için bellek ayırır
  • İşlev çağrısında sağlanan uzunluğa göre yinelenir (URLENCODE ile olduğu gibi işlevde hesaplanmaz).

Not: Birçok programcı muhtemelen bir döngü yinelerler bu şekilde için, biraz hackish var görmemiştim değil standart kongre, ödeme dikkatine-döngüler için, bu atar En çok kullanılan xve yüzerinde, çıkış kontrolleri len0 ulaşan ve artışlarla hem xve y. Biliyorum, beklediğiniz gibi değil, geçerli bir kod.

  • Mevcut karakteri, içinde eşleşen bir karakter konumuna atar str.
  • Mevcut karakterin alfasayısal mı yoksa karakterlerden biri olup olmadığını kontrol eder _-.ve değilse, aramaları önceden oluşturduğu URLENCODE ile hemen hemen aynı atamayı yaparız, ancak bunun y++yerine farklı şekilde artarız to[1], çünkü dizeler farklı şekillerde inşa ediliyor, ancak yine de aynı hedefe ulaşıyor.
  • Döngü bittiğinde ve uzunluk gittiğinde, aslında \0baytı atayarak dizeyi sonlandırır .
  • Kodlanmış dizeyi döndürür.

farklılıklar:

  • UrlEncode alanı kontrol eder, bir + işareti atar, RawURLEncode kaydetmez.
  • UrlEncode \0dizeye bir bayt atamaz, RawUrlEncode yapar (bu bir tartışma noktası olabilir)
  • Onlar bir hatalı biçimlendirilmiş dizeleri ile taşma eğilimli olabilir, differntly yineleme, ben değilim sadece düşündüren bu ve ben değil aslında araştırdık.

Temel olarak farklı şekilde tekrar ederler, ASCII 20'de bir + işareti atar.

EBCDIC'deki farklılıklar:

UrlEncode:

  • ASCII ile aynı yineleme kurulumu
  • Hala "boşluk" karakterini + işaretine çeviriyor . Not-- Bunun EBCDIC'de derlenmesi gerektiğini mi yoksa bir hata ile mi karşılaşacağınızı düşünüyorum? Birisi bunu düzenleyebilir ve onaylayabilir mi?
  • Bu kontroller mevcut karakter önce karakter ise 0bir olmanın dışında, .ya -, YA az Aama daha büyük Char 9, OR büyüktür Zaz ve aancak bir _. VEYA daha büyük z(evet, EBCDIC ile çalışmak biraz karışıktır). Bunlardan herhangi biriyle eşleşirse, ASCII sürümünde bulunanla benzer bir arama yapın (sadece os_toascii'de bir arama gerektirmez).

RAWURLENCODE:

  • ASCII ile aynı yineleme kurulumu
  • URL Kodlamasının EBCDIC sürümünde açıklananla aynı kontrol, ancak bundan büyükse URL kodundan zhariç tutulur ~.
  • ASCII RawUrlEncode ile aynı atama
  • Hala \0dönmeden önce dizeye bayt ekleniyor .

Genel Özet

  • Her ikisi de aynı hexchars arama tablosunu kullanır
  • URIEncode \ 0 ile bir dizeyi sonlandırmaz, raw yapar.
  • EBCDIC'de çalışıyorsanız, ~UrlEncode'un çalışmadığını yönettiği için RawUrlEncode kullanmanızı öneririm ( bu bildirilen bir sorundur ). ASCII ve EBCDIC 0x20'nin her ikisinin de boşluk olduğunu belirtmek gerekir.
  • Farklı bir şekilde tekrar ederler, biri daha hızlı olabilir, biri hafızaya veya dize tabanlı istismarlara eğilimli olabilir.
  • URIEncode içine boşluk +bırakıyor, RawUrlEncode %20dizi aramaları ile boşluk bırakıyor .

Feragatname: Yıllardır C'ye dokunmadım ve EBCDIC'e gerçekten uzun zamandır bakmadım. Eğer bir yerde yanılıyorsam bana haber ver.

Önerilen uygulamalar

Tüm bunlara dayanarak, rawurlencode çoğu zaman gitmenin yoludur. Jonathan Fingland'ın cevabında gördüğünüz gibi, çoğu durumda buna sadık kalın. URI bileşenleri için modern şema ile ilgilenir, burada urlencode şeyleri eski okul yolunda yapar, burada + "uzay" anlamına gelir.

Eski biçim ve yeni biçimler arasında dönüştürme yapmaya çalışıyorsanız, kodunuzun yukarı çıkmadığından emin olun ve yanlışlıkla çift kodlama veya bunun etrafındaki benzer "oops" senaryolarını kullanarak kodu çözülmüş + işareti olan bir alanı boşluğa dönüştürün. boşluk /% 20 / + sorunu.

Yeni formatı tercih etmeyen eski bir yazılımla eski bir sistem üzerinde çalışıyorsanız, urlencode ile sadık kalın, ancak% 20'nin aslında çalıştığı eski standart% 20 altında olduğu gibi geriye dönük olarak uyumlu olacağına inanıyorum. tercihli. Oyun oynamak için bir şans verin, sizin için nasıl çalıştığını bize bildirin.

Temel olarak, EBCDIC sisteminiz gerçekten senden nefret etmedikçe çiğ kalmalısınız. Çoğu programcı 2000 yılından sonra, hatta 1990'dan sonra yapılan herhangi bir sistemde asla EBCDIC ile karşılaşmayacaktır (bu zorlayıcıdır, ancak yine de bence muhtemelen).


Ben ne düşündüğüm kodlama yapıyor çünkü ben ne kodlanmış bilmeliyim bilmem gerekir sonra hiç çift kodlama hakkında endişelenmek zorunda kaldım. Aldığım her şeyi, alan için nasıl tedavi edileceğini bilen bir uyumluluk modu ile deşifre ettiğim için, burada uyarmaya çalıştığınız sorunlara asla eşit olarak rastlamadım. Bir şeyin ne yaptığını bilmiyorsak kaynağa bakmayı anlayabilirim, ama burada tam olarak ne öğrendik, zaten her iki işlevi de yerine getirmekten bilmiyorduk. Önyargılı olduğumu biliyorum ama yardım edemiyorum ama bunun çoktan geçtiğini düşünüyorum. Çaba olsa Kudos! =)
nickl-

2
+1, bu bölüm için: "% 20'nin aslında geriye dönük olarak uyumlu olacağına inanıyorum, eski standart% 20 altında çalıştığı gibi, sadece tercih edilmedi"
Gras Double

3
İyi cevap, ama belki biraz abartılı mı?
rinogo

38
echo rawurlencode('http://www.google.com/index.html?id=asd asd');

verim

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd%20asd

süre

echo urlencode('http://www.google.com/index.html?id=asd asd');

verim

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd+asd

Aradaki fark asd%20asdvsasd+asd

urlencode, boşlukları kodlamak +yerine RFC 1738'den farklıdır%20


28

Birini diğerinden seçmenin pratik nedenlerinden biri, sonucu başka bir ortamda, örneğin JavaScript'te kullanacak olmanızdır.

PHP yılında urlencode('test 1')getiri 'test+1'ise rawurlencode('test 1')getiriler 'test%201'sonucu.

Ancak bunu decodeURI () işlevini kullanarak JavaScript'te "kodunu çözmeniz " gerekiyorsa , sonuç olarak decodeURI("test+1")size "test+1"verirken decodeURI("test%201")size verir "test 1".

Başka bir deyişle, PHP'de urlencode ile artı ("+") olarak kodlanan alanın ("") JavaScript'te decodeURI tarafından düzgün bir şekilde kodu çözülmeyecektir .

Bu gibi durumlarda rawurlencode PHP işlevi kullanılmalıdır.


6
Bu gördüğüm en iyi cevap. Gerçek dünya örneğiyle kullanım için bir öneri sunar. Ayrıca, özlüdür.
dotancohen

Tercih ettiğim halde json_encodeve JSON.parsebu amaçla güzel bir örnek .
Fabrício Matté

21

Boşlukların şu şekilde kodlanması gerektiğine inanıyorum:

  • %20 URL yolu bileşeninin içinde kullanıldığında
  • +URL sorgu dizesi bileşeni veya form verileri içinde kullanıldığında (bkz. 17.13.4 Form içeriği türleri )

Aşağıdaki örnek, doğru kullanımını gösteren rawurlencodeve urlencode:

echo "http://example.com"
    . "/category/" . rawurlencode("latest songs")
    . "/search?q=" . urlencode("lady gaga");

Çıktı:

http://example.com/category/latest%20songs/search?q=lady+gaga

Yol ve sorgu dizesi bileşenlerini ters yönde kodlarsanız ne olur? Aşağıdaki örnek için:

http://example.com/category/latest+songs/search?q=lady%20gaga
  • Web sunucusu latest+songsyerine dizini arayacaktırlatest songs
  • Sorgu dizesi parametresi qşunları içerir:lady gaga

2
"Sorgu dizesi parametresi qiçerecektir lady gagaaksi Başka ne içerecektir"? Query parametresi , PHP 5.2 ve sonrasında kullanılmasından bağımsız olarak diziye qaynı değere geçirilmiş gibi görünmektedir . Yine de, GET istekleri için varsayılan formatta kodlar, bu yüzden yaklaşımınıza devam ediyorum. +1$_GETrawurlencodeurlencodeurlencodeapplication/x-www-form-urlencoded
Fabrício Matté

2
Ben her iki açıklığa kavuşturmak istedim +ve %20sorgu dizeleri kullanıldığında boşluk olarak çözülür.
Salman A

5

Fark, dönüş değerlerinde, yani:

urlencode () :

-_ dışında alfasayısal olmayan tüm karakterlerin bulunduğu bir dize döndürür. bir yüzde (%) işareti ve ardından iki onaltılık basamak ve artı (+) işareti olarak kodlanan boşluklarla değiştirildi. WWW formundan gönderilen verilerin kodlandığı şekilde kodlanır, yani application / x-www-form-urlencoded media tipindekiyle aynı şekilde kodlanır. Bu, »RFC 1738 kodlamasından (bkz. Rawurlencode ()) farklıdır, çünkü tarihsel nedenlerden dolayı boşluklar artı (+) işaretleri olarak kodlanır.

rawurlencode () :

-_ dışında alfasayısal olmayan tüm karakterlerin bulunduğu bir dize döndürür. yerine yüzde (%) işareti ve ardından iki onaltılık basamak gelir. Bu, değişmez karakterlerin özel URL sınırlayıcıları olarak yorumlanmasını önlemek ve URL'lerin karakter dönüşümlü iletim ortamı (bazı e-posta sistemleri gibi) tarafından yönetilmesini önlemek için »RFC 1738'de açıklanan kodlamadır.

İkisi çok benzer, ancak ikincisi (rawurlencode), '%' ve parolaları kodlamak için uygun olan bir '%' ve iki onaltılık hane ile yerlerin yerini alacaktır;

echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
     '@ftp.example.com/x.txt">';
//Outputs <a href="ftp://user:foo%20%40%2B%25%2F@ftp.example.com/x.txt">

2
OP, hangisinin ne zaman kullanılacağını nasıl bileceğini soruyor. Her birinin boşluklarla ne yaptığını bilmek, farklı dönüş değerlerinin önemini bilmiyorsa OP'nin karar vermesine yardımcı olmaz.
dotancohen

5

1. Farklılıklar tam olarak nedir ve

Tek fark, boşlukların işlenme biçimidir:

urlencode - eski uygulamaya dayalı olarak boşlukları +

rawurlencode - RFC 1738 tabanlı alanları% 20'ye çevirir

Aradaki farkın nedeni, URL'lerde + ayrılmış ve geçerli (kodlanmamış) olmasıdır.

2. hangisi tercih edilir?

Birini diğerinden seçmenin bazı nedenlerini görmek istiyorum ... Sadece birini seçip sonsuza kadar en az yaygara ile kullanmak istiyorum.

Yeterince adil, size yardımcı olacağı ümidiyle sizinle paylaşacağım bu kararları verirken izlediğim basit bir stratejim var.

Bence " Toleranslı uygulamalar " için HTTP / 1.1 şartname RFC 2616 olduğunu düşünüyorum

İstemciler, Durum Satırını ayrıştırma konusunda hoşgörülü OLMALIDIR ve İstek Satırını ayrıştırırken sunucuları hoşgörülü olmalıdır.

Bu tür sorularla karşılaşıldığında en iyi strateji her zaman mümkün olduğu kadar tüketmek ve standartlara uygun olanı üretmek.

Bu nedenle tavsiyem, rawurlencodestandartlara uygun RFC 1738 kodlu dizeler üretmek ve urldecodegeriye dönük olarak uyumlu olmak ve tüketmek için karşılaşabileceğiniz her şeyi kullanmaktır .

Şimdi benim sözümü alabilirsin ama kanıtlayalım ki ...

php > $url = <<<'EOD'
<<< > "Which, % of Alice's tasks saw $s @ earnings?"
<<< > EOD;
php > echo $url, PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > echo urlencode($url), PHP_EOL;
%22Which%2C+%25+of+Alice%27s+tasks+saw+%24s+%40+earnings%3F%22
php > echo rawurlencode($url), PHP_EOL;
%22Which%2C%20%25%20of%20Alice%27s%20tasks%20saw%20%24s%20%40%20earnings%3F%22
php > echo rawurldecode(urlencode($url)), PHP_EOL;
"Which,+%+of+Alice's+tasks+saw+$s+@+earnings?"
php > // oops that's not right???
php > echo urldecode(rawurlencode($url)), PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > // now that's more like it

Görünüşe göre PHP'nin tam olarak aklında olduğu görülüyordu, iki formattan birini reddeden hiç kimseyle karşılaşmadım, defacto stratejiniz olarak benimsemek için daha iyi bir strateji düşünemiyorum, değil mi?

Njoy!


4

urlencode : Bu, tarihsel nedenlerden dolayı boşlukların artı (+) işaretleri olarak kodlanması bakımından »RFC 1738 kodlamasından (bkz. rawurlencode ()) farklıdır.


2

Spaces olarak kodlanmış %20vs.+

rawurlencode()Çoğu durumda kullandığım en büyük neden , urlencodemetin alanlarını +(artı işaretleri) rawurlencodeolarak kodladığı ve burada yaygın olarak görülen kodlar olduğu için %20:

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

Özellikle kodlanmış metin sorguları %20bir boşluk için bekliyoruz ve sonuç olarak bunun yerine bir artı işareti kullanılırsa başarısız kabul bazı API uç noktaları gördük . Açıkçası bu, API uygulamaları arasında farklılık gösterecektir ve kilometreniz değişebilir.


1

Ben urlencode sorgu parametreleri için, rawurlencode yol bölümleri için olduğuna inanıyorum. Bunun nedeni esas olarak sorgu parametreleri için %20vs yol segmentleri +içindir. Boşluklardan bahseden şu cevaba bakın: Boşluk ne zaman artı (+) veya% 20 olarak kodlanır?

Ancak %20şimdi sorgu parametrelerinde de çalışıyor, bu yüzden rawurlencode her zaman daha güvenlidir. Bununla birlikte, artı işareti, kullanıcı düzenleme sorgularının ve sorgu parametrelerinin okunabilirliğinin önemli olduğu yerlerde kullanılma eğilimindedir.

Bunun , boşluklara rawurldecodekod çözülmediğini unutmayın +( http://au2.php.net/manual/en/function.rawurldecode.php ). $ _GET her zaman otomatik olarak geçirilir nedeni budur urldecode, hangi araçlar +ve %20her iki alanlara çözülür.

Kodlamanın ve kod çözmenin girişler ve çıkışlar arasında tutarlı olmasını istiyorsanız +ve %20sorgu parametreleri için değil her zaman kullanmayı seçtiyseniz , urlencodesorgu parametreleri (anahtar ve değer) için iyidir.

Sonuç:

Yol Bölümleri - her zaman rawurlencode / rawurldecode kullanın

Sorgu Parametreleri - kod çözme için her zaman urldecode (otomatik olarak yapılır) kullanın, kodlama için hem rawurlencode hem de urlencode iyidir, özellikle URL'leri karşılaştırırken tutarlı olmak için birini seçin.


0

simple * rawurlencode path - path "?" den önceki kısımdır - boşluklar% 20 olarak kodlanmalıdır * urlencode sorgu dizesi - Sorgu dizesi "?" -uzaylar "+" olarak daha iyi kodlanır = rawurlencode genellikle daha uyumludur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.