파일 목록을 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}}
    -
목록형 📷 갤러리형
제목
[기본형] HTML (with 부트스트랩5.3 , jquery 3.7, vue.js)
유용한 리눅스(LINUX) 명령어
[공지] 기술 게시판
4.28
4.29
4.30
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16
5.17
5.18
5.19
5.20
5.21
5.22
5.23
5.24
5.25
5.26
5.27
5.28
5.29
5.30
5.31
6.1