윈도우 서버에서 아파치로 구동하던 PHP 웹사이트를 리눅스 서버로 이전했던 적이 있었는데, 이전 하고 나서 게시판에 한글명으로 등록된 이미지들이 모두 보이지 않았습니다.
서버 환경 변화에 따른 인코딩 문제인데, 간단한 해결 방법으로는 urlencode 함수를 쓰는 것입니다.
URL은 보통 ASCII 문자집합으로 표현되는데, ASCII 코드 집합을 벗어나는 문자(한글 같은 경우)를 사용하는 경우, 브라우저에서 제대로 인식하지 못할 수 있습니다. 그래서 이러한 문자들을 브라우저가 인식할 수 있도록 %가 붙은 16진수 값(Hexadecimal digits)으로 표현해주어야 하며 이 과정이 URL 인코딩입니다.
이런식으로 되어 있는 코드를
* TIP 하나~
만약 단순 파일명만 인코딩한다면 위와 같이 써도 되지만, 파일의 경로까지 함께 묶여있는 파일명을 인코딩 해야 한다면 다음과 같이 하면 됩니다.
위의 코드는 / (슬래시) 를 포함하는 파일 경로인 경우 슬래시를 별도로 인코딩문자로 변경해주는 작업을 합니다. (/ = %2F)
* TIP 둘~
만약 파일명에 띄어쓰기가 되어 있다면!!
위의 이미지 파일은
%EC%95%88%EB%85%95+%ED%95%98%EC%84%B8%EC%9A%94.jpg
이렇게 인코딩이 됩니다. 잘 보시면 중간에 + 가 보일 텐데, urlencode는 공백을 사용하지 않는 빈 공간(blank)를 + 로 대체합니다.
종종 + 로 대체하는 경우, 이미지 파일을 제대로 표기하지 못하는 경우가 있습니다.
이런 경우에 공백 또한 하나의 문자로 보고 이 공백을 인코딩해주도록 하면 됩니다.
이 때에는 rawurlencode 함수를 사용하면 됩니다.
그러면 공백은 %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 |
'개발&컴퓨터 > PHP' 카테고리의 다른 글
[PHP] POST로 file 배열 데이터 넘길 때, 배열의 20개까지의 데이터만 넘어가는 문제 해결법. (45) | 2014.07.16 |
---|