PHP에서 문자열을 올바르게 인코딩하려면 어떻게 해야 합니까?
검색 페이지를 만들고 있습니다. 여기서 검색 쿼리를 입력하면 양식이 다음 주소로 전송됩니다.search.php?query=your query
검색 쿼리 인코딩/복호화에는 어떤 PHP 기능이 가장 좋습니까?
URI 쿼리의 경우 urldecode
/를 사용하고, 그 외의 경우에는 /rawurldecode
를 사용합니다.
「 」의 urlencode
★★★★★★★★★★★★★★★★★」rawurlencode
?
urlencode
application/x-www-form-urlencoded에 따라 부호화한다(공간은 다음과 같이 부호화됨).+
) 이면서도rawurlencode
plain Percent-Encoding에 따라 부호화됩니다(공간은%20
를 참조해 주세요.
교활한 이름의 urlencode() 및 urldecode().
ㄴ, ㄴ는 안 돼요.urldecode()
$_POST
★★★★★★★★★★★★★★★★★」$_GET
.
다음은 매우 많은 양의 인코딩이 필요한 사용 사례입니다.작위적이라 생각하실지 모르겠지만, 저희는 이걸 생산으로 운영하고 있습니다.공교롭게도 이것은 모든 종류의 인코딩에 대응하고 있기 때문에 튜토리얼로서 투고합니다.
사용 사례 설명
방금 저희 웹사이트에서 선불 기프트 카드(토큰)를 구입하셨습니다.이이이이 URL 이이이이이 。이 고객은 URL을 다른 사람에게 이메일로 보내려고 합니다.의 웹 에는, 「 」가 포함되어 .mailto
그렇게 할 수 있는 링크입니다.
PHP 코드
// The order system generates some opaque token
$token = 'w%a&!e#"^2(^@azW';
// Here is a URL to redeem that token
$redeemUrl = 'https://httpbin.org/get?token=' . urlencode($token);
// Actual contents we want for the email
$subject = 'I just bought this for you';
$body = 'Please enter your shipping details here: ' . $redeemUrl;
// A URI for the email as prescribed
$mailToUri = 'mailto:?subject=' . rawurlencode($subject) . '&body=' . rawurlencode($body);
// Print an HTML element with that mailto link
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>';
주의:로 하고 .「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 。text/html
타입이 「」인 .text/json
그냥 '우리'를 쓰세요.$retval['url'] = $mailToUri;
는 「부재」에 의해서 입니다.json_encode()
.
테스트 케이스
- PHP 테스트 사이트에서 코드를 실행합니다(여기서 언급해야 할 표준 코드가 있습니까?)
- 링크를 클릭하세요.
- 이메일을 보내다
- 이메일을 받다
- 해당 링크를 클릭합니다.
다음 사항을 확인해 주십시오.
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
물론 은 JSON의 입니다.$token
abovedisclossible을 합니다.
URL 인코딩 함수를 사용할 수 있습니다. PHP에는 다음과 같은 기능이 있습니다.
rawurlencode()
기능.
ASP는
Server.URLEncode()
기능.
JavaScript에서는
encodeURIComponent()
기능.
실행하는 RFC 표준 부호화 타입에 따라 또는 부호화를 커스터마이즈할 필요가 있는 경우는, 독자적인 클래스를 작성할 수 있습니다.
/**
* UrlEncoder make it easy to encode your URL
*/
class UrlEncoder{
public const STANDARD_RFC1738 = 1;
public const STANDARD_RFC3986 = 2;
public const STANDARD_CUSTOM_RFC3986_ISH = 3;
// add more here
static function encode($string, $rfc){
switch ($rfc) {
case self::STANDARD_RFC1738:
return urlencode($string);
break;
case self::STANDARD_RFC3986:
return rawurlencode($string);
break;
case self::STANDARD_CUSTOM_RFC3986_ISH:
// Add your custom encoding
$entities = ['%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'];
$replacements = ['!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"];
return str_replace($entities, $replacements, urlencode($string));
break;
default:
throw new Exception("Invalid RFC encoder - See class const for reference");
break;
}
}
}
사용 예:
$dataString = "https://www.google.pl/search?q=PHP is **great**!&id=123&css=#kolo&email=me@liszka.com)";
$dataStringUrlEncodedRFC1738 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC1738);
$dataStringUrlEncodedRFC3986 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC3986);
$dataStringUrlEncodedCutom = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_CUSTOM_RFC3986_ISH);
유언 출력:
string(126) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP+is+%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(130) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP%20is%20%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(86) "https://www.google.pl/search?q=PHP+is+**great**!&id=123&css=#kolo&email=me@liszka.com)"
* RFC 표준에 대한 자세한 내용은 https://datatracker.ietf.org/doc/rfc3986/ 및 urlencode vs rawurlencode를 참조하십시오.
사람들이 어떻게 계속 말하는지 알잖아요: "PHP에서 json 문자열을 수동으로 작성하지 마세요.상상전전전전전전json_encode()
안정성/신뢰성을 향상시킵니다.
쿼리 문자열을 작성하는 경우, "PHP에서 URL 쿼리 문자열을 수동으로 작성하지 마십시오. 항상 안정성/신뢰성을 요구합니다."라고 말합니다.
데모:
$array = [
'query' => 'your query',
'example' => null,
'Qbert says:' => '&%=#?/'
];
echo http_build_query($array);
echo "\n---\n";
echo http_build_query($array, '', '&');
출력:
query=your+query&Qbert+says%3A=%26%25%3D%23%3F%2F
---
query=your+query&Qbert+says%3A=%26%25%3D%23%3F%2F
이 함수의 세세한 내용은 입력 배열의 요소가 다음 값을 갖는 경우입니다.null
그러면 해당 요소는 출력 문자열에 포함되지 않습니다.
Joomla Stack Exchange에 대한 교육적인 답변은 다음과 같습니다.&
커스텀 딜리미터로 지정합니다.Joomla URL 쿼리 문자열은 보통 "&"가 아닌 "&"로 구분됩니다.
처음에 쿼리 문자열 데이터를 어레이 형식으로 패키징하면 컴팩트하고 읽기 쉬운 구조를 얻을 수 있습니다.그 후,의 호출을 통해 데이터 파손을 방지할 수 있습니다.저는 일반적으로 작은 쿼리 문자열 구성에도 이 기술을 선택합니다.
언급URL : https://stackoverflow.com/questions/4744888/how-to-properly-url-encode-a-string-in-php
'programing' 카테고리의 다른 글
JavaScript에서 달러 기호의 목적은 무엇입니까? (0) | 2022.11.01 |
---|---|
숫자의 나눗셈 나머지를 찾습니다. (0) | 2022.11.01 |
LIKE 문을 사용하여 PDO 파라미터화된 쿼리를 작성하려면 어떻게 해야 합니까? (0) | 2022.11.01 |
스프링 부트 @ResponseBody가 엔티티 ID를 직렬화하지 않음 (0) | 2022.11.01 |
MySQL의 DESCRIPT [표]와 동등한 SQLite가 있습니까? (0) | 2022.11.01 |