ইউরেনকোড বনাম কাঁচারলেঙ্কোড?


380

আমি যদি একটি ভেরিয়েবল ব্যবহার করে একটি ইউআরএল তৈরি করতে চাই তবে আমার কাছে স্ট্রিংটিকে এনকোড করার দুটি পছন্দ আছে। urlencode()এবং rawurlencode()

পার্থক্যগুলি ঠিক কী এবং কোনটি পছন্দ?


1
আমি একে অপরের থেকে একটি বেছে নেওয়ার কয়েকটি কারণ দেখতে চাই (যেমন সমস্যাগুলির মধ্যে একটি বা অন্যটির সাথে মুখোমুখি হতে পারে), আমি (এবং আমি অন্যদের প্রত্যাশা করি) কেবল একটি বাছাই করতে সক্ষম হতে চাই এবং এটি দিয়ে চিরতরে ব্যবহার করতে চাই কমপক্ষে গোলমাল, তাই আমি এই প্রশ্নে একটি অনুগ্রহ শুরু করেছি।
Kjqai

29
@ চালচালক: আপনি যদি কেবল একটি চয়ন করতে চান তবে চয়ন করুন rawurlencode। আপনি খুব কমই এমন একটি সিস্টেমে চলে যাবেন যা ফাঁকা স্থান হিসাবে এনকোড দেওয়ার সময় চোকসকে চাপিয়ে দেবে, যখন ফাঁকা জায়গাগুলিতে এনকোড %20হওয়া সিস্টেমগুলি +আরও সাধারণ।
অ্যানোমি

উত্তর:


326

এটি আপনার উদ্দেশ্য উপর নির্ভর করবে। যদি অন্য সিস্টেমের সাথে আন্তঃব্যবহারযোগ্যতা গুরুত্বপূর্ণ হয় তবে মনে হয় কাঁচাবার্নকোডই যাওয়ার উপায়। এক ব্যতিক্রম হ'ল উত্তরাধিকার ব্যবস্থাগুলি যা কোয়েরি স্ট্রিংকে% 20 এর পরিবর্তে + এনকোড করা ফাঁকা জায়গাগুলির ফর্ম-এনকোডিং শৈলী অনুসরণ করার প্রত্যাশা করে (এই ক্ষেত্রে আপনার urlencode প্রয়োজন)।

Rawurlencode পিএইচপি 5.3.0 এর আগে আরএফসি 1738 অনুসরণ করে এবং পরে আরএফসি 3986 পরে ( http://us2.php.net/manual/en/function.rawurlencode.php দেখুন )

একটি স্ট্রিং প্রদান করে যেখানে -_। Except ব্যতীত সমস্ত অ-অক্ষরীয় অক্ষর দুটি শতাংশের অঙ্কের পরে শতাংশ (%) চিহ্ন দ্বারা প্রতিস্থাপিত হয়েছে। আক্ষরিক অক্ষরগুলিকে বিশেষ ইউআরএল ডিলিমিটার হিসাবে ব্যাখ্যা করা থেকে রক্ষা করার জন্য, এবং অক্ষর রূপান্তর (কিছু ইমেল সিস্টেমের মতো) সংক্রমণ মিডিয়া দ্বারা ইউআরএলগুলিকে ম্যাঙ্গেল করা থেকে রক্ষা করার জন্য »আরএফসি 3986-এ বর্ণিত এটি এনকোডিং।

জন্য RFC 3986 বনাম 1738. rawurlencode পূর্বে উপর নোট 5.3 পিএইচপি এনকোড টিল্ড অক্ষর ( ~) পিএইচপি 5.3 এর জন্য RFC 1738. হিসেবে অনুযায়ী, কিন্তু, rawurlencode জন্য RFC 3986 অক্ষর টিল্ড এনকোডিং এর প্রয়োজন হয় না অনুসরণ করে।

urlencode যেমন এনকোড স্পেস যুক্ত চিহ্ন (না %20যেমন rawurlencode মধ্যে সম্পন্ন) (দেখুন http://us2.php.net/manual/en/function.urlencode.php )

একটি স্ট্রিং প্রদান করে যাতে -_ ব্যতীত সমস্ত অ-অক্ষরীয় অক্ষর। শতাংশ (%) চিহ্ন দ্বারা প্রতিস্থাপিত হয়েছে তারপরে দুটি হেক্স ডিজিট এবং প্লাস (+) চিহ্ন হিসাবে এনকোড করা ফাঁকা স্থান রয়েছে। এটি ডাব্লুডাব্লুডাব্লু ফর্মের পোস্ট ডেটা যেভাবে এনকোড করা হয়েছে ঠিক সেভাবেই এনকোড করা হয়েছে, এটি একইভাবে অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded মিডিয়া টাইপ। এটি »আরএফসি 3986 এনকোডিং থেকে আলাদা (rawতিহাসিক কারণে, কাঁচারলেঙ্কোড () দেখুন) স্পেসগুলি প্লাস (+) চিহ্ন হিসাবে এনকোড করা হয়েছে।

এটি আরএফসি 1866 -তে অ্যাপ্লিকেশন / x-www-form-urlencoded সংজ্ঞার সাথে মিলে যায় ।

অতিরিক্ত পড়া:

আপনি আলোচনাটি http://bytes.com/groups/php/5624-urlencode-vs-rawurlencode এও দেখতে চাইতে পারেন ।

এছাড়াও, আরএফসি 2396 এক নজর দেখার মতো। আরএফসি 2396 বৈধ ইউআরআই সিনট্যাক্স সংজ্ঞায়িত করে। আমরা আগ্রহী মূল অংশটি 3.4 অনুসন্ধান উপাদান থেকে:

কোয়েরির উপাদানগুলির মধ্যে অক্ষরগুলি সংরক্ষিত থাকে।";", "/", "?", ":", "@",
"&", "=", "+", ",", and "$"

যেমন আপনি দেখতে পাচ্ছেন, এটি +ক্যোয়ারী স্ট্রিংয়ের একটি সংরক্ষিত অক্ষর এবং সুতরাং আরএফসি 3986 (কাঁচার্লিনকোড হিসাবে) অনুযায়ী এনকোড করা দরকার।


27
সুতরাং যা preffered হয়?
গ্যারি উইলফবি

79
rawurlencode। এক্ষেত্রে মান সহকারে চলুন। ইউরেনকোডটি কেবলমাত্র উত্তরাধিকারের ব্যবহারের জন্য রাখা হয়
জোনাথন ফিংল্যান্ড

2
দুর্দান্ত ধন্যবাদ, আমি যা ভেবেছিলাম তা ঠিক আছে, প্রচুর কোড আপডেট করা শুরু করার আগে আমি একটি দ্বিতীয় মতামত চেয়েছিলাম।
গ্যারি উইলফোবি

3
আমার মনে হয় এটি এমন কাঁচাল্লেঙ্কোড যা স্পেসগুলি আরও লক্ষণ হিসাবে নয় তবে% 20 এর হিসাবে এনকোড করে না
BigName

2
@ পিন্দাতজুহ: আপনি যে অংশটি উদ্ধৃত করেছেন তার ব্যতিক্রম হ'ল ব্যতিক্রমী সিস্টেমগুলি যা কোয়েরি স্ট্রিংটি ফর্ম-এনকোডিং শৈলীটি% 20 এর পরিবর্তে এনকোডেড ফাঁকা স্থান অনুসরণ করবে বলে আশা করে (যার ক্ষেত্রে আপনার ইউরেনকোডের দরকার আছে) এর অর্থ যখন কাঁচাআরলেঙ্কোড বেশিরভাগ পরিস্থিতির জন্য সঠিক , কিছু সিস্টেম প্রত্যাশা করে যে ফাঁকগুলি + (প্লাস সাইন) হিসাবে এনকোড করা হবে। এই জাতীয় সিস্টেমের জন্য, ইউরেনকোডই ভাল পছন্দ।
জোনাথন ফিংল্যান্ড

213

প্রুফ পিএইচপি এর উত্স কোডে আছে।

ভবিষ্যতে আপনি যে কোনও সময় নিজেরাই এই ধরণের জিনিসটি কীভাবে সন্ধান করতে পারবেন তাড়াতাড়ি একটি প্রক্রিয়া নিয়ে যাচ্ছি। আমার সাথে সহ্য করুন, প্রচুর সি সোর্স কোড পাবেন যা আপনি এড়িয়ে যেতে পারেন (আমি এটি ব্যাখ্যা করছি)। আপনি যদি কিছু সিতে ব্রাশ করতে চান তবে একটি ভাল জায়গা শুরু করার জন্য আমাদের এসও উইকি

উত্সটি ডাউনলোড করুন (বা এটি অনলাইন ব্রাউজ করার জন্য http://lxr.php.net/ ব্যবহার করুন ), ফাংশন নামের জন্য সমস্ত ফাইল গ্রেপ করুন, আপনি এর মতো কিছু পাবেন:

পিএইচপি 5.3.6 (লেখার সময় সর্বাধিক সাম্প্রতিক) ফাইল ইউআরএল.সি . তে তাদের স্থানীয় সি কোডের দুটি ফাংশন বর্ণনা করে ।

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);
}

ঠিক আছে, তাহলে এখানে কি আলাদা?

তারা দু'জনই যথাক্রমে দুটি পৃথক অভ্যন্তরীণ ফাংশনকে কল করছেন: পিএইচপি_আর_আরল_েনকোড এবং পিএইচপি_উর_ইনকোড

সুতরাং functions ফাংশনগুলি সন্ধান করুন!

পিএইচপি_আরও_উরাল_ইনকোডটি দেখতে দিন

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);
}

এবং অবশ্যই, 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;
}

আমি এগিয়ে যাওয়ার আগে জ্ঞানের এক দ্রুত বিট, ইবিসিডিআইসি আরেকটি চরিত্র সেট , এএসসিআইআই এর মতো, তবে মোট প্রতিযোগী। পিএইচপি উভয়ের সাথে ডিল করার চেষ্টা করে। তবে মূলত, এর অর্থ বাইট EBCDIC 0x4c বাইট LASCII এ নয়, এটি আসলে একটি <। আমি নিশ্চিত আপনি এখানে বিভ্রান্তি দেখতে পাবেন।

ওয়েব সার্ভারটি যদি এটি সংজ্ঞায়িত করে থাকে তবে এই উভয় ফাংশনই EBCDIC পরিচালনা করে।

এছাড়াও, তারা উভয় hexcharsকিছু মান পেতে অক্ষরের অ্যারে ব্যবহার করে (স্ট্রিংয়ের ধরণটি মনে করেন) চেহারা দেখুন, অ্যারেটি যেমন বর্ণিত হয়:

/* 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";

এর বাইরে, ফাংশনগুলি সত্যই আলাদা, এবং আমি এএসসিআইআই এবং ইসিসিডিআইসি তে তাদের ব্যাখ্যা করতে যাচ্ছি।

এএসসিআইআই মধ্যে পার্থক্য:

URLENCODE:

  • ইনপুট স্ট্রিংয়ের শুরু / শেষের দৈর্ঘ্য গণনা করে, মেমরি বরাদ্দ করে
  • স্ট্রিংয়ের শেষে পৌঁছানো অবধি ইনক্রিমেন্টগুলি কিছুক্ষণের মধ্য দিয়ে চলে
  • বর্তমানের চরিত্রটি ধরে ফেলে
  • অক্ষরটি ASCII চর 0x20 (যেমন, "স্থান") এর সমান +হলে আউটপুট স্ট্রিংয়ে একটি চিহ্ন যোগ করুন ।
  • যদি একটি স্থান নয়, এবং এটি আলফানিউমেরিক নয় ( isalnum(c)), এবং এছাড়াও এবং _, -অথবা .চরিত্র, তারপর আমরা, আউটপুট একটি %অ্যারের অবস্থান 0 সাইন, একটি বিন্যাস বর্ণন পর্যন্ত না hexcharsঅ্যারের জন্য একটি লুকআপ জন্য os_toasciiঅ্যারে ( (বর্তমান চরিত্রের) কীটির জন্য অ্যাপাচি থেকে একটি অ্যারে যা চরটি হেক্স কোডে অনুবাদ করেc ), তারপরে আমরা 4 টি দিয়ে ডানদিকে সরিয়ে নিয়েছি, মানটি 1 টির জন্য নির্ধারণ করি এবং 2 পজিশনে আমরা একই বর্ণনাকে নির্ধারণ করি, আমরা পূর্বরূপ ছাড়াই একটি যৌক্তিক এবং মানটি 15 (0xF) হয় কিনা তা দেখতে এবং সেই ক্ষেত্রে একটি 1 বা অন্যথায় 0 প্রদান করে। শেষে, আপনি এনকোডযুক্ত কিছু দিয়ে শেষ করবেন।
  • যদি এটি শেষ হয় এটি কোনও স্থান নয়, এটি আলফানিউমিক বা একটি _-.অক্ষর, এটি ঠিক কী ফলাফল করে।

RAWURLENCODE:

  • স্ট্রিংয়ের জন্য মেমরি বরাদ্দ করে
  • এটি ফাংশন কল সরবরাহ করা দৈর্ঘ্যের উপর ভিত্তি করে Iterates (URLENCODE হিসাবে ফাংশন গণনা করা হয় না)।

দ্রষ্টব্য: অনেক প্রোগ্রামার সম্ভবত এইভাবে লুপ পুনরাবৃত্তির জন্য কখনও দেখেনি, এটি কিছুটা হ্যাকিশ এবং বেশিরভাগ লুপের সাথে ব্যবহৃত স্ট্যান্ডার্ড কনভেনশন নয়, মনোযোগ দিন, এটি বরাদ্দ করেছেন xএবং y, len0 এ পৌঁছনোর জন্য চেক এবং উভয়ই ইনক্রিমেন্ট xএবং y। আমি জানি, এটি আপনি যা চান তা নয়, তবে এটি বৈধ কোড valid

  • উপস্থিত অক্ষরটিকে একটি মিলের চরিত্রের অবস্থানটিতে নির্ধারণ করে str
  • এটি বর্তমান অক্ষরটি বর্ণানুক্রমিক বা চরিত্রগুলির মধ্যে একটি কিনা এটি পরীক্ষা করে _-.এবং এটি না হলে আমরা প্রায় একই কাজটি করি ইউর্লিনকোডের সাথে যেখানে এটি পূর্বরূপ দেখায়, তবে আমরা আলাদাভাবে বৃদ্ধি করি, তার y++পরিবর্তে ব্যবহার করে to[1], কারণ এটি স্ট্রিংগুলি বিভিন্ন উপায়ে নির্মিত হচ্ছে, তবে যাইহোক যাইহোক একই লক্ষ্যে পৌঁছান।
  • লুপটি শেষ হয়ে গেলে এবং দৈর্ঘ্য শেষ হয়ে গেলে, এটি আসলে স্ট্রিংটি বন্ধ করে \0বাইটটি বরাদ্দ করে ।
  • এটি এনকোডযুক্ত স্ট্রিংটি দেয়।

পার্থক্য:

  • ইউরেলকোড স্থানের জন্য পরীক্ষা করে, একটি + চিহ্ন সাইন করে, RawURLEncode দেয় না।
  • UrlEncode \0স্ট্রিংটিতে একটি বাইট বরাদ্দ করে না , RawUrlEncode (এটি একটি মোট পয়েন্ট হতে পারে) করে
  • তারা স্বতঃস্ফূর্তভাবে পুনরাবৃত্তি করে, কেউ ত্রুটিযুক্ত স্ট্রিংগুলি দিয়ে উপচে পড়ার প্রবণতা হতে পারে, আমি কেবল এটির পরামর্শ দিচ্ছি এবং আমি আসলে তদন্ত করি নি

এগুলি মূলত আলাদাভাবে পুনরাবৃত্তি হয়, একজন এএসসিআইআই 20 এর ইভেন্টে একটি + চিহ্ন সাইন করে।

EBCDIC মধ্যে পার্থক্য:

URLENCODE:

  • ASCII এর মতো একই পুনরাবৃত্তির সেটআপ
  • এখনও "স্পেস" অক্ষরটিকে একটি + চিহ্নে অনুবাদ করে । দ্রষ্টব্য - আমি মনে করি এটি EBCDIC- এ সংকলন করা দরকার বা আপনি একটি বাগ সহ শেষ করবেন? কেউ কি এটি সম্পাদনা ও নিশ্চিত করতে পারবেন?
  • এটা তোলে চেক যদি বর্তমান গৃহস্থালির কাজ করার পূর্বে একটি গৃহস্থালি 0, একটি হচ্ছে বাদে .বা -, বা কম Aকিন্তু গৃহস্থালির কাজ বেশি 9, বা তার চেয়ে অনেক বেশী Zকম এবং aহলেও _বা এর চেয়েও বড় z(হ্যাঁ, EBCDIC এ নিয়ে কাজ করার জন্য মেশানো হয়েছে)। যদি এটির কোনওটির সাথে মিলে যায় তবে ASCII সংস্করণে পাওয়া একই অনুরূপ অনুসন্ধান করুন (এটি কেবল os_toascii এ দেখার প্রয়োজন হবে না)।

RAWURLENCODE:

  • ASCII এর মতো একই পুনরাবৃত্তির সেটআপ
  • ইউআরএল এনকোডের EBCDIC সংস্করণে বর্ণিত একই চেক ব্যতিক্রম ব্যতীত যদি এটির চেয়ে বড় হয় তবে এটি ইউআরএল এনকোড থেকে zবাদ দেয় ~
  • ASCII RawUrlEncode হিসাবে একই কাজ ment
  • এখনও সংযোজন \0রিটার্ন আগে স্ট্রিং বাইট।

গ্র্যান্ড সারসংক্ষেপ

  • দু'জনেই একই হেক্সারচর লুকিং টেবিল ব্যবহার করে
  • ইউআরআইএনকোড একটি স্ট্রিং \ 0 দিয়ে শেষ করে না, কাঁচা করে।
  • আপনি যদি EBCDIC এ কাজ করছেন তবে আমি RawUrlEncode ব্যবহার করার পরামর্শ দেব, কারণ এটি ~UrlEncode পরিচালনা করে না ( এটি একটি রিপোর্ট করা সমস্যা )। এটি লক্ষণীয় যে ASCII এবং EBCDIC 0x20 উভয় স্থানই।
  • তারা পৃথকভাবে পুনরাবৃত্তি করে, একটি দ্রুত হতে পারে, একটি স্মৃতি বা স্ট্রিং ভিত্তিক শোষণের প্রবণ হতে পারে।
  • ইউআরআইএনকোড একটি স্থান তৈরি করে +, RawUrlEncode %20অ্যারে লুকআপের মাধ্যমে একটি স্থান তৈরি করে ।

দাবি অস্বীকার: আমি বছরের পর বছরগুলিতে সি স্পর্শ করিনি, এবং আমি সত্যই দীর্ঘ সময়ে ইসিসিডিকের দিকে তাকাতে পারি নি। আমি যদি কোথাও ভুল হয়ে থাকি তবে আমাকে জানান।

প্রস্তাবিত বাস্তবায়ন

এই সমস্ত কিছুর উপর ভিত্তি করে, বেশিরভাগ সময় যাওয়ার রাস্তাটিই কাঁচাবার্নকোড। আপনি যেমন জোনাথন ফিংল্যান্ডের উত্তরটি দেখতে পাচ্ছেন, বেশিরভাগ ক্ষেত্রে এটির সাথে আঁকুন। এটি ইউআরআই উপাদানগুলির জন্য আধুনিক স্কিম নিয়ে কাজ করে, যেখানে ইউরেনকোডটি পুরানো স্কুল পথে কাজ করে, যেখানে + এর অর্থ "স্পেস"।

আপনি যদি পুরানো ফর্ম্যাট এবং নতুন ফর্ম্যাটগুলির মধ্যে রূপান্তর করার চেষ্টা করছেন, তবে নিশ্চিত হয়ে নিন যে আপনার কোডটি বোকা বানানো হয়নি এবং ঘটনাক্রমে ডাবল-এনকোডিং বা এর আশেপাশের অনুরূপ "ওফস" পরিস্থিতি দ্বারা এমন একটি স্থান যা ডিকোডযুক্ত + সাইনকে একটি স্পেসে পরিণত করেছে doesn't স্পেস / 20% / + ইস্যু।

আপনি যদি পুরানো সফটওয়্যার সহ এমন কোনও পুরানো সিস্টেমে কাজ করছেন যা নতুন ফর্ম্যাটটিকে পছন্দ করে না তবে ইউরেলকোডটি আটকে রাখুন তবে আমি বিশ্বাস করি যে% 20 আসলে পুরানো স্ট্যান্ডার্ড% 20 এর অধীনে যেমন সামঞ্জস্যপূর্ণ হবে ঠিক তেমন হয়নি পছন্দ করল। আপনি যদি চারপাশে খেলার জন্য প্রস্তুত থাকেন তবে এটি আপনার জন্য কীভাবে কার্যকর হয়েছিল তা আমাদের জানান।

মূলত, আপনার কাঁচা সঙ্গে থাকা উচিত, যদি না আপনার ইবিসিডিআইসি সিস্টেমটি আপনাকে সত্যিই ঘৃণা করে। 2000 সালের পরে তৈরি কোনও সিস্টেমে বেশিরভাগ প্রোগ্রামাররা কখনই ইসিসিডিকের মধ্যে চলবে না, সম্ভবত ১৯৯০ এমনকি (এটি চাপ দিচ্ছে, তবে এখনও আমার মতে সম্ভবত)।


ডাবল এনকোডিংয়ের বিষয়ে আমাকে কখনই চিন্তা করতে হয়নি কারণ আমি কী এনকোড করেছি তা আমার জানা উচিত, যেহেতু এটি আমার মনে হবে এমন এনকোডিংটি আমার দ্বারা করা হচ্ছে। যেহেতু আমি একটি সামঞ্জস্যতা মোডের সাথে আমি প্রাপ্ত সমস্ত কিছুই ডিকোড করি যা জানে যে স্থানের জন্য কীভাবে চিকিত্সা করতে হয় তা আমি এখানে সমানভাবে কখনও আসতে পারি নি যেখানে আপনি এখানে সতর্ক করার চেষ্টা করছেন। আমি উত্সটির দিকে তাকিয়ে বুঝতে পারি যদি আমরা কিছু না কি জানি না তবে আমরা এখানে ঠিক কী শিখলাম যে কেবলমাত্র উভয় ফাংশন সম্পাদন করে আমরা ইতিমধ্যে জানতাম না। আমি জানি আমি পক্ষপাতদুষ্ট কিন্তু আমি সহায়তা করতে পারি না তবে মনে করি এটি ওভারবোর্ড হয়ে গেছে। চেষ্টা করেও কুডোস! =)
নিকল-

2
+1, এই অংশটির জন্য: "আমি বিশ্বাস করি% 20 আসলে পিছনের দিকে সামঞ্জস্যপূর্ণ হবে, যেমন পুরানো স্ট্যান্ডার্ড% 20 এর অধীনে কাজ করা হয়েছে, ঠিক তেমন পছন্দ করা হয়নি"
গ্রাস ডাবল

3
ভাল উত্তর, তবে একটু ওভারকিল হতে পারে?
রিনোগো

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

উৎপাদনের

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

যখন

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

উৎপাদনের

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

পার্থক্য asd%20asdবনাম হচ্ছেasd+asd

urlencode এর +পরিবর্তে স্থানগুলি এনকোড করে আরএফসি 1738 থেকে পৃথক from%20


28

একে অপরকে বেছে নেওয়ার একটি ব্যবহারিক কারণ হ'ল আপনি যদি অন্য পরিবেশে ফলাফলটি ব্যবহার করতে চলেছেন, উদাহরণস্বরূপ জাভাস্ক্রিপ্ট।

পিএইচপি urlencode('test 1')আয় 'test+1'যখন rawurlencode('test 1')আয়'test%201' ফলে।

তবে আপনার যদি জাভাস্ক্রিপ্টে ডিকোডিউরি () ফাংশনটি ব্যবহার করে "ডিকোড" decodeURI("test+1")করতে হয় "test+1"তবে decodeURI("test%201")আপনাকে দেওয়ার সময় আপনাকে দেবে"test 1" ফলস্বরূপ ।

অন্য কথায় স্থান ( "") দ্বারা এনকোড urlencode প্লাস ( "+ +") পিএইচপি সঠিকভাবে দ্বারা সঙ্কেতমুক্ত করা হবে না decodeURI জাভাস্ক্রিপ্ট হবে।

এই জাতীয় ক্ষেত্রে Rawurlencode পিএইচপি ফাংশন ব্যবহার করা উচিত।


6
এটি এখন পর্যন্ত সবচেয়ে ভাল উত্তর যা আমি দেখেছি। এটি ব্যবহারের জন্য একটি বাস্তব জগতের উদাহরণ দিয়ে ফিরে পরামর্শ দেয়। অতিরিক্তভাবে, এটি সংক্ষিপ্ত।
dotancohen

এটি একটি দুর্দান্ত উদাহরণ, যদিও আমি পছন্দ করি json_encodeএবং JSON.parseসেই উদ্দেশ্যে।
Fabrício ম্যাট

21

আমি বিশ্বাস করি যে স্থানগুলি অবশ্যই এনকোড করা উচিত:

নিম্নলিখিত উদাহরণটি এর সঠিক ব্যবহার rawurlencodeএবং urlencode:

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

আউটপুট:

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

আপনি যদি পথ এবং ক্যোয়ারিং স্ট্রিং উপাদানগুলিকে অন্যভাবে রাস্তায় এনকোড করেন তবে কী হবে? নিম্নলিখিত উদাহরণের জন্য:

http://example.com/category/latest+songs/search?q=lady%20gaga
  • ওয়েবসারভার ডিরেক্টরিটি সন্ধান করবে latest+songs পরিবর্তেlatest songs
  • ক্যোরিয় স্ট্রিং প্যারামিটারে qথাকবেlady gaga

2
"কোয়েরি স্ট্রিং প্যারামিটার qথাকতে হবে lady gaga" এটা অন্যথায় আর কী থাকতে পারে? ক্যোয়ারী প্যারামিটারটি PHP 5.2+ ব্যবহার বা নির্বিশেষে অ্যারেতে qএকই মানটি পাস করেছে বলে মনে হচ্ছে । যদিও, GET অনুরোধগুলির জন্য পূর্বনির্ধারিত ফর্ম্যাটে এনকোড রয়েছে তাই আমি আপনার পদ্ধতির সাথে যাচ্ছি। +1$_GETrawurlencodeurlencodeurlencodeapplication/x-www-form-urlencoded
ফ্যাব্রেসিও মাট্টি

2
আমি নির্মল উভয় যে চেয়েছিলেন +এবং %20যখন কোয়েরি স্ট্রিং ব্যবহৃত স্থান হিসেবে ডিকোড করা হয়।
সালমান এ

5

পার্থক্যটি প্রত্যাবর্তনের মানগুলির মধ্যে, যেমন:

ইউরেনকোড () :

একটি স্ট্রিং প্রদান করে যাতে -_ ব্যতীত সমস্ত অ-অক্ষরীয় অক্ষর। শতাংশ (%) চিহ্ন দ্বারা প্রতিস্থাপিত হয়েছে তারপরে দুটি হেক্স ডিজিট এবং প্লাস (+) চিহ্ন হিসাবে এনকোড করা ফাঁকা স্থান রয়েছে। এটি ডাব্লুডাব্লুডাব্লু ফর্মের পোস্ট ডেটা যেভাবে এনকোড করা হয়েছে ঠিক সেভাবেই এনকোড করা হয়েছে, এটি একইভাবে অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded মিডিয়া টাইপ। এটি »আরএফসি 1738 এনকোডিং থেকে পৃথক হয়েছে (rawতিহাসিক কারণে কাঁচারলেঙ্কোড (দেখুন), স্পেসগুলি প্লাস (+) চিহ্ন হিসাবে এনকোড করা হয়েছে।

Rawurlencode () :

একটি স্ট্রিং প্রদান করে যাতে -_ ব্যতীত সমস্ত অ-অক্ষরীয় অক্ষর। দুটি হেক্স অঙ্কের পরে শতাংশ (%) চিহ্ন দিয়ে প্রতিস্থাপন করা হয়েছে। আক্ষরিক অক্ষরগুলিকে বিশেষ ইউআরএল ডিলিমিটার হিসাবে ব্যাখ্যা করা থেকে রক্ষা করার জন্য এবং অক্ষর রূপান্তর (কিছু ইমেল সিস্টেমের মতো) সংক্রমণ মিডিয়া দ্বারা ইউআরএলগুলিকে ম্যাঙ্গেল করা থেকে রক্ষা করার জন্য »আরএফসি 1738 এ বর্ণিত এটি এনকোডিং।

দুটি খুব অনুরূপ, তবে পরবর্তী (Rawurlencode) স্পেসগুলি একটি '%' এবং দুটি হেক্স ডিজিটের সাথে প্রতিস্থাপন করবে, যা এনকোডিং পাসওয়ার্ড বা এই জাতীয় ক্ষেত্রে উপযুক্ত, যেখানে '+' যেমন নয়:

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
ওপি জিজ্ঞাসা করবে যে কোনটি ব্যবহার করতে হবে এবং কখন ব্যবহার করতে হয়। স্পেস দিয়ে প্রতিটি কী করে তা জেনে ওপিকে সিদ্ধান্ত নিতে সাহায্য করে না যদি তিনি বিভিন্ন ফেরতের মানগুলির গুরুত্ব জানেন না।
dotancohen

5

1. পার্থক্য ঠিক কি এবং

স্থানগুলি যেভাবে আচরণ করা হয় তার মধ্যে কেবলমাত্র পার্থক্য:

ইউরেনকোড - উত্তরাধিকার বাস্তবায়নের উপর ভিত্তি করে স্পেসগুলি + এ রূপান্তর করে

Rawurlencode - আরএফসি 1738 এর উপর ভিত্তি করে স্থানগুলি% 20 অনুবাদ করে

পার্থক্যের কারণ হ'ল ইউআরএলগুলিতে + সংরক্ষিত এবং বৈধ (আনঙ্কডবিহীন)।

2. কোনটি পছন্দ?

আমি একে অপরকে বেছে নেওয়ার কিছু কারণ দেখতে চাই ... আমি কেবল একটি বেছে নিতে এবং এটিকে সর্বদা কমদামের সাথে গোলমাল করে ব্যবহার করতে সক্ষম হতে চাই।

যথেষ্ট ভাল, আমার কাছে একটি সহজ কৌশল রয়েছে যা আমি এই সিদ্ধান্তগুলি গ্রহণ করার সময় অনুসরণ করি যা এই আশায় আপনার সাথে ভাগ করে নেব যে এটি সাহায্য করতে পারে।

আমি মনে করি এটি ছিল HTTP / 1.1 স্পেসিফিকেশন আরএফসি 2616 যা " সহনীয় অ্যাপ্লিকেশনগুলি " চেয়েছিল

অনুরোধ-লাইনটি বিশ্লেষণ করার সময় ক্লায়েন্টরা স্থিতি-লাইন এবং সার্ভারগুলি সহন সহনশীল হতে হবে।

যখন এই জাতীয় প্রশ্নের মুখোমুখি হয় সর্বদা সর্বোত্তম কৌশলটি সর্বদা সম্ভব যথাসম্ভব গ্রাস করা এবং মানদণ্ডের সাথে মানানসই উত্পাদন করা।

সুতরাং আমার পরামর্শটি rawurlencodeমানদণ্ড অনুসারে আরএফসি 1738 এনকোডযুক্ত স্ট্রিং উত্পাদন এবং ব্যবহার করতে ব্যবহার করাurldecode এবং পশ্চাদপটে সামঞ্জস্যপূর্ণ হতে এবং আপনি যে কোনও আসতে তা সামঞ্জস্য করতে করতে পারেন।

এখন আপনি কেবল এটির জন্য আমার শব্দটি নিতে পারেন তবে এটি প্রমাণ করতে দিন যে আমরা ...

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

এটি প্রদর্শিত হবে যে পিএইচপি মনে মনে এটি ছিল, যদিও আমি দুটি ফর্ম্যাট উভয়ই প্রত্যাখ্যান করে কারও কাছে আসিনি, আমি আপনার ডিফ্যাক্টো কৌশল হিসাবে গ্রহণ করার জন্য আরও ভাল কৌশলটি ভাবতে পারি না, আপনি কি পারেন?

nJoy!


4

ইউরেলকোড : এটি »আরএফসি 1738 এনকোডিং থেকে আলাদা (rawতিহাসিক কারণে এই ক্ষেত্রে কাঁচাবার্নকোড (দেখুন), স্পেসগুলি প্লাস (+) চিহ্ন হিসাবে এনকোড করা হয়েছে।


2

স্পেসগুলি হিসাবে এনকোড করা হয়েছে %20বনাম+

আমি rawurlencode()বেশিরভাগ ক্ষেত্রে ব্যবহার করতে দেখেছি সবচেয়ে বড় কারণ হ'ল urlencodeপাঠ্য ফাঁকা স্থানগুলি +(আরও লক্ষণ) rawurlencodeহিসাবে এনকোড করা হয়েছে যেখানে এগুলিকে সাধারণভাবে দেখা হিসাবে এনকোড করে %20:

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

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

আমি নির্দিষ্টভাবে এপিআই এর শেষ পয়েন্টগুলি দেখেছি যা এনকোডযুক্ত পাঠ্য প্রশ্নগুলি %20কোনও স্থানের জন্য দেখার প্রত্যাশাকে গ্রহণ করে এবং ফলস্বরূপ, পরিবর্তে যদি একটি প্লাস চিহ্ন ব্যবহার করা হয় তবে ব্যর্থ হয়। স্পষ্টতই এটি API বাস্তবায়নগুলির মধ্যে পার্থক্য করতে চলেছে এবং আপনার মাইলেজটি ভিন্ন হতে পারে।


1

আমি বিশ্বাস করি urlencode ক্যোয়ারি প্যারামিটারের জন্য, অন্যদিকে Rawurlencode পাথ বিভাগগুলির জন্য। এটি মূলত ক্যোয়ার প্যারামিটারগুলির জন্য %20বনাম পাথ বিভাগগুলির +জন্য। এই উত্তরটি দেখুন যা ফাঁকা স্থান সম্পর্কে কথা বলে: কখন স্থানটি প্লাস (+) বা% 20 এ এনকোড করা হবে?

তবে %20এখন ক্যোয়ারি প্যারামিটারগুলিতেও কাজ করে, এজন্যই কাঁচাবার্নকোড সবসময় নিরাপদ। যাইহোক, প্লাস চিহ্নটি ব্যবহার করা হয় যেখানে ব্যবহারের ক্যোয়ারী প্যারামিটারগুলির সম্পাদনা এবং পাঠযোগ্যতার অভিজ্ঞতা।

নোট করুন যে এর অর্থ স্থানগুলিতে rawurldecodeডিকোড হয় না +( http://au2.php.net/manual/en/function.rawurldecode.php )। এ কারণেই $ _GET সর্বদা স্বয়ংক্রিয়ভাবে অতিক্রম করে যায় urldecodeযার অর্থ এটি +এবং %20উভয়ই স্পেসে ডিকোড হয়।

আপনি যদি এনকোডিং এবং ডিকোডিংটি ইনপুট এবং আউটপুটগুলির মধ্যে সামঞ্জস্য রাখতে চান এবং আপনি সর্বদা ব্যবহারের জন্য বেছে নিয়েছেন এবং কোয়েরি প্যারামিটারের জন্য +নয় %20, তবেurlencode ক্যোয়ারী প্যারামিটারগুলির জন্য (কী এবং মান) ভাল।

উপসংহারটি হ'ল:

পাথ বিভাগগুলি - সর্বদা কাঁচাবার্নকোড / কাঁচারেলডিকোড ব্যবহার করুন

ক্যোয়ারী প্যারামিটারগুলি - ডিকোডিংয়ের জন্য সর্বদা ইউরলডকোড (স্বয়ংক্রিয়ভাবে সম্পন্ন) ব্যবহার করুন, এনকোডিংয়ের জন্য, কাঁচাল্লেঙ্কোড বা ইউরেনকোড উভয়ই ঠিক আছে, বিশেষত ইউআরএলগুলির তুলনা করার সময় একটি নির্দিষ্ট করুন।


0

সরল * কাঁচারেলঙ্কোড পথ - পথটি "এর আগে অংশ?" - স্পেসগুলি% 20 * ইউরেনকোডকে কোয়েরি স্ট্রিং হিসাবে এনকোড করতে হবে - "স্ট্রিংটি" এর পরে অংশ? " স্পেসগুলি "+" হিসাবে আরও ভাল এনকোড করা থাকে = কাঁচাবার্নকোড সাধারণত আরও উপযুক্ত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.