본문 바로가기

개발&컴퓨터/PHP

PHP에서 한글 파일 이미지 깨짐현상 해결 방법

반응형

윈도우 서버에서 아파치로 구동하던 PHP 웹사이트를 리눅스 서버로 이전했던 적이 있었는데, 이전 하고 나서 게시판에 한글명으로 등록된 이미지들이 모두 보이지 않았습니다.

 

서버 환경 변화에 따른 인코딩 문제인데, 간단한 해결 방법으로는 urlencode 함수를 쓰는 것입니다.

 

URL은 보통 ASCII 문자집합으로 표현되는데, ASCII 코드 집합을 벗어나는 문자(한글 같은 경우)를 사용하는 경우, 브라우저에서 제대로 인식하지 못할 수 있습니다. 그래서 이러한 문자들을 브라우저가 인식할 수 있도록 %가 붙은 16진수 값(Hexadecimal digits)으로 표현해주어야 하며 이 과정이 URL 인코딩입니다.

 

 

<img src="<?='파일명.jpg' ?>" />

이런식으로 되어 있는 코드를

 

<img src="<?=urlencode('파일명.jpg') ?>" />
로 바꿔주면 됩니다.

 

 

 

* TIP 하나~

 

만약 단순 파일명만 인코딩한다면 위와 같이 써도 되지만, 파일의 경로까지 함께 묶여있는 파일명을 인코딩 해야 한다면 다음과 같이 하면 됩니다.

 

<img src="<?=str_replace('%2F', '/', urlencode($file_name)) ?>" />

 

위의 코드는 / (슬래시) 를 포함하는 파일 경로인 경우 슬래시를 별도로 인코딩문자로 변경해주는 작업을 합니다. (/ = %2F)

 

 

* TIP 둘~

 

만약 파일명에 띄어쓰기가 되어 있다면!!

 

<img src="<?=urlencode('안녕 하세요.jpg') ?> />

 

위의 이미지 파일은

%EC%95%88%EB%85%95+%ED%95%98%EC%84%B8%EC%9A%94.jpg

이렇게 인코딩이 됩니다. 잘 보시면 중간에 + 가 보일 텐데, urlencode는 공백을 사용하지 않는 빈 공간(blank)를 + 로 대체합니다.

종종 + 로 대체하는 경우, 이미지 파일을 제대로 표기하지 못하는 경우가 있습니다.

 

이런 경우에 공백 또한 하나의 문자로 보고 이 공백을 인코딩해주도록 하면 됩니다.

이 때에는 rawurlencode 함수를 사용하면 됩니다.

 

<img src="<?=rawurlencode('안녕 하세요.jpg') ?> />

 

그러면 공백은 %20 이라는 인코딩값으로 대체됩니다.

 

%EC%95%88%EB%85%95%20%ED%95%98%EC%84%B8%EC%9A%94.jpg

 

이러면 모든 브라우저에 정상적으로 한글 파일을 인식합니다. (띄어쓰기 이슈는 한글 파일 뿐만 아니라 영문 파일에서도 적용됩니다.

 

 

* 참조 (URL Encoding Table)

 

Character Purpose in URL Encoding
: Separate protocol (http) from address %3A
/ Separate domain and directories %2F
# Separate anchors %23
? Separate query string %3F
& Separate query elements %24
@ Separate username and password from domain %40
% Indicates an encoded character %25
+ Indicates a space %2B
<space> Invalid in URLs %20 or +
; Invalid in URLs %3B
= Invalid in URLs $3D
$ Invalid in URLs %26
, Invalid in URLs %2C
< Invalid in URLs %3C
> Invalid in URLs %3E
~ Invalid in URLs %25
^ Invalid in URLs %5E
` Invalid in URLs %60
\ Invalid in URLs %5C
[ Invalid in URLs %5B
] Invalid in URLs %5D
{ Invalid in URLs %7B
} Invalid in URLs %7D
| Invalid in URLs %7C
" Invalid in URLs %22

 

반응형