প্রুফ পিএইচপি এর উত্স কোডে আছে।
ভবিষ্যতে আপনি যে কোনও সময় নিজেরাই এই ধরণের জিনিসটি কীভাবে সন্ধান করতে পারবেন তাড়াতাড়ি একটি প্রক্রিয়া নিয়ে যাচ্ছি। আমার সাথে সহ্য করুন, প্রচুর সি সোর্স কোড পাবেন যা আপনি এড়িয়ে যেতে পারেন (আমি এটি ব্যাখ্যা করছি)। আপনি যদি কিছু সিতে ব্রাশ করতে চান তবে একটি ভাল জায়গা শুরু করার জন্য আমাদের এসও উইকি ।
উত্সটি ডাউনলোড করুন (বা এটি অনলাইন ব্রাউজ করার জন্য 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 বাইট L
ASCII এ নয়, এটি আসলে একটি <
। আমি নিশ্চিত আপনি এখানে বিভ্রান্তি দেখতে পাবেন।
ওয়েব সার্ভারটি যদি এটি সংজ্ঞায়িত করে থাকে তবে এই উভয় ফাংশনই 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
, len
0 এ পৌঁছনোর জন্য চেক এবং উভয়ই ইনক্রিমেন্ট 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 সালের পরে তৈরি কোনও সিস্টেমে বেশিরভাগ প্রোগ্রামাররা কখনই ইসিসিডিকের মধ্যে চলবে না, সম্ভবত ১৯৯০ এমনকি (এটি চাপ দিচ্ছে, তবে এখনও আমার মতে সম্ভবত)।