PHP에서 URL을 다룰 때 한글이나 특수문자가 깨지는 인코딩 문제는 흔히 발생하는 이슈입니다. 올바른 인코딩 방법을 알아보겠습니다.
문제: 공백과 특수문자 처리 방식의 차이를 모르고 사용
<?php
$text = "안녕하세요 PHP 개발자";
// 폼 데이터용 (공백을 +로 변환)
$form_encoded = urlencode($text);
echo $form_encoded; // %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94+PHP+%EA%B0%9C%EB%B0%9C%EC%9E%90
// URL 경로용 (공백을 %20으로 변환)
$url_encoded = rawurlencode($text);
echo $url_encoded; // %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94%20PHP%20%EA%B0%9C%EB%B0%9C%EC%9E%90
?>
문제: URL 파라미터에 한글이나 특수문자가 포함되어 깨짐
<?php
$search_term = "PHP & MySQL 강의";
$category = "웹개발";
// 올바른 방법
$url = "search.php?" . http_build_query([
'q' => $search_term,
'category' => $category
]);
echo $url; // search.php?q=PHP+%26+MySQL+%EA%B0%95%EC%9D%98&category=%EC%9B%B9%EA%B0%9C%EB%B0%9C
?>
문제: 인코딩된 데이터를 제대로 디코딩하지 않음
<?php
// $_GET은 자동으로 디코딩되지만 명시적 처리가 필요한 경우
$raw_data = "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94";
$decoded = urldecode($raw_data);
echo $decoded; // 안녕하세요
// 이중 인코딩 방지
if (isset($_GET['search'])) {
$search = trim($_GET['search']);
// 추가 검증 로직
}
?>
문제: JSON 데이터를 URL에 포함할 때 인코딩 문제
<?php
$data = [
'name' => '김철수',
'message' => '안녕하세요! 반갑습니다.'
];
// JSON을 URL에 안전하게 포함
$json_string = json_encode($data, JSON_UNESCAPED_UNICODE);
$encoded_json = urlencode($json_string);
$url = "api.php?data=" . $encoded_json;
// 받는 쪽에서 처리
$received_data = json_decode(urldecode($_GET['data']), true);
?>
문제: 한글 파일명이 포함된 다운로드 링크가 작동하지 않음
<?php
$filename = "한글파일명.pdf";
// 다운로드 링크 생성
$safe_filename = rawurlencode($filename);
$download_url = "download.php?file=" . $safe_filename;
// 다운로드 헤더 설정
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($filename));
?>