PHP URL 인코딩 문제 해결하기

프리터코더·2025년 5월 25일
0

php 문제 해결

목록 보기
28/79

PHP에서 URL을 다룰 때 한글이나 특수문자가 깨지는 인코딩 문제는 흔히 발생하는 이슈입니다. 올바른 인코딩 방법을 알아보겠습니다.

1. urlencode()와 rawurlencode() 올바르게 사용하기

문제: 공백과 특수문자 처리 방식의 차이를 모르고 사용

<?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
?>

2. GET 파라미터 안전하게 전달하기

문제: 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
?>

3. URL에서 파라미터 안전하게 받기

문제: 인코딩된 데이터를 제대로 디코딩하지 않음

<?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']);
    // 추가 검증 로직
}
?>

4. JSON과 URL 인코딩 함께 사용하기

문제: 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);
?>

5. 파일명 URL 인코딩 처리

문제: 한글 파일명이 포함된 다운로드 링크가 작동하지 않음

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

주의사항

  • urlencode(): 폼 데이터 전송시 사용 (공백 → +)
  • rawurlencode(): URL 경로나 파일명에 사용 (공백 → %20)
  • http_build_query(): 여러 파라미터를 안전하게 조합할 때 사용
  • 항상 UTF-8 인코딩을 사용하세요
profile
일용직 개발자. freetercoder@gmail.com

0개의 댓글