파일 목록을 XML(UTF-8)로 처리할 때 URL로의 접근 문제 해결법

파일 목록을 XML(UTF-8)로 처리할 때 URL로의 접근 문제 해결법
(utf-8과 euc-kr 사이의 url 문제)


현상과 원인

$x =  rawurlencode('테스트');
print($x."\n");
$x =  rawurlencode(iconv('euc-kr','utf-8','테스트'));
print($x);

위 소스는 PHP로 euc-kr 서버에서 실행 할 경우 결과는
%C5%D7%BD%BA%C6%AE
%ED%85%8C%EC%8A%A4%ED%8A%B8
가 됩니다.

즉, 같은 테스트라도 euc-kr과 utf-8에서의 urlencode 값이 다릅니다.
(다른 이유 : utf-8과 euc-kr의 ASCII를 제외한 글자값이 다르기 때문)

그래서
EUC-KR 서버에서
UTF-8로 구성한 XML로 (euc-kr글자는 utf-8글자로 바뀜)
test/테스트/테스트.txt
같은 값을 넘겨주고
URL을
./test/테스트/테스트.txt
처럼 구성해서 접속할 경우
./test/ 까지는 정상적으로 접근할 수 있지만.
./test/테스트/ 부터 접근이 불가능해진다.

URL은 한글을 쓸 수 없다. 쓸 수 있는 건 ASCII범위의 글자와 몇몇 기호뿐이다.
(전에 이런말 했다가 디지게 욕먹었는 데, 틀린 말이 아니다.)
한글은 %xx%yy 형식으로 바꿔 사용하게 된다.(URLENCODE)
(브라우저에서 한글을 적어도 접속이 되서 보이는건, 브라우저에서 알아서 %xx%yy를 처리해줬기 때문이다. 이 것만 믿고 작업했다가는 낭패보기 쉽다.)

다시 본론으로 들어가서
URL ./test/테스트/테스트.txt 는 현재 UTF-8로된 값이므로
./test/%ED%85%8C%EC%8A%A4%ED%8A%B8/%ED%85%8C%EC%8A%A4%ED%8A%B8.txt
이렇게 URL이 변경되어 접속될 것이다.
하지만 서버안에 있는 파일의 URL은
./test/%C5%D7%BD%BA%C6%AE/%C5%D7%BD%BA%C6%AE.txt
이 된다.
즉, 둘은 서로다른 URL을 가지게 되므로 해당 파일에 접근 할 수가 없다.


해결법

해결법은 간단하다.
미리 encode된 URL을 넘겨주면 된다.
XML로 값을 넘겨줄 때 UTF-8로 변환해서 UI쪽에 보여줄 값 하나.
utf-8로 변환하지 않고 내부에 접속할 수 있는 경로를 urlencode 한 값 하나.

XML의 노드는
<node
path = "test/테스트/테스트.txt"    ## utf-8로 변경된 값
enc_path = "test/%C5%D7%BD%BA%C6%AE/%C5%D7%BD%BA%C6%AE.txt"  ##변경되지 않고 urlencode 된 값
/>

위 처럼 구성될 수 있을것이다.

js나 flash에서 문자열의 charset(인코딩)을 변경하는건 힘든 작업이다.
enc_path가 없을 경우 서버의 charset에 따라서 path를 다시 변경해서 urlencode 처리한 경로 값을 사용해야한다.
하지만 enc_path로 미리 urlencode 된 값을 넘겨주면, js나 flash 쪽에서 서버가 어떤 charset인지 신경 쓸 필요 없이
enc_path만 사용하면 된다.


이게 꼭 정확한 해결방법이라고 할 수 없다.
서버자체가 utf-8로 된경우 이런 방법을 쓰지 않고 바로 urlencode해서 URL로 접근하면 된다.


여기서 urlencode 라고 적었는데,
flash에서는 escape()
php에서는 urlencode(),rawurlencode()
js에서는 encodeURI(),encodeURIComponent()
에 대응되는 것으로 생각하시면 됩니다.

댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
제목 작성자 날짜
공대여자
공대여자
mins01
공대여자
공대여자
공대여자
공대여자
공대여자