URL의 일부분에 한국어 사용
URL의 일부분에 한국어 사용
RFC 3986을 기초로하여 인코딩하는 rawurlencode() 함수
rawurlencode() 함수로 URL 인코딩하면 <a> 태그의 href 속성에 한국어를 포함한 값을 전달하거나 'index.php?search=문자열'과 같은 쿼리(query) 문자열에 한국어를 이용할 수 있습니다
쿼리 문자열 등 HTTP 요청에서 받은 데이터는 PHP에 의해 자동으로 디코딩되므로 특별히 처리하지 않고 그대로 이용할 수 있습니다.
URL 인코딩된 후 파일 등에 저장된 데이터를 다시 꺼냈을 때 자동으로 디코딩되지 않기 때문에 rawurlencode() 함수가 있습니다. 이들 함수의 차이는 싱글 바이트 공백과 '~'의 인코딩으로 urlencode() 함수에서는 각각 '+'와 '%7E'가 되고 rawurlencode() 함수에서는 '%20', '~'가 됩니다(PHP 5.3 이후 rawurlencode() 함수는 RFC 3986에 따라 '~'을 인코딩하지 않습니다). Web API 등에서는 RFC 3986에서 URL 인코딩이 요구되는 경우가 많으므로 다음의 예제에서는 rawurlencode() 함수를 사용하고 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>URL의 일부분에 한국어를 이용하고 싶을 때</title>
</head>
<body>
<div>
<form method="get" action="urlencode.php">
<p>문자열을 입력하고 링크를 클릭합니다<br>
<input type="text" name="data">
<input type="submit" value="전송">
</p>
</form>
<?php
// h() 함수 레시피 218를 불러옵니다 레시피 041.
require_once '../../../../lib/h.php';
if (isset($_GET['data'])) {
$string = $_GET['data'];
// URL을 인코딩합니다.
$urlEncode = rawurlencode($_GET['data']);
$url = $_SERVER['SCRIPT_NAME'] . '?data2=' . $urlEncode;
echo '처리 전 문자열: ' . h($string) . '<br>';
echo '인코딩 처리 후: ' . h($urlEncode) . '<br>';
echo '<a href="' . h($url) . '">링크</a>';
}
if (isset($_GET['data2'])) {
$string = $_GET['data2'];
echo '디코딩 처리 후: ' . h($string);
}
?>
</div>
</body>
</html>