유니코드와 로컬 코드(예, KSX-1001)는 실제로 겹치는 부분이 많이 있기 때문에 유니코드인지 검사하는 방법은 없습니다. 그런데 실제로 일반적인 네트워크 스트림에서는 유니코드를 바로 사용하기가 힘들기 때문에 UTF-8로 인코딩을 해서 사용합니다. 예를 들어 '가'의 UCS-2 값은 0xAC00인데 첫 바이트는 0xAC이지만 두번째 바이트가 0x00이기 때문에 일반적인 환경에서는 NULL로 인식해 버리죠. 그래서 유니코드를 바로 사용하려면 명시적으로 UCS-2 나 UCS-4로 구분해 주어야 합니다.
같은 이유로 유니코드와 안시 코드 구분도 거의 불가능 하겠죠.
꼭 구분을 해야하는 경우라면, 적어도 이게 어느 나라 언어인지 정도는 미리 알려주어야 구분을 할 수 있을텐데요.
웹서버를 만드시고 계시는 군요.
저도 예전에 회사에서 웹서버 비스무리(?)한거 개발한 적이 있었죠.
지금 문제는 UTF-8인지 안시코드(윈도우에서 사용되는 코드 말씀하시는 거 맞죠? 한글은 CP-949 같은...)인지 구분이 잘 안 되기 때문이네요.
일단, 웹브라우저에서 URL을 보내는 경우는 UTF-8과 로컬코드 이렇게 두 가지 경우 밖에 없습니다. 다양한 언어의 웹 브라우저를 처리해야 한다면 무척 문제가 어려워집니다. 로컬코드를 받아서 이게 어느 나라 말인가 판단하는 일은 거의 불가능합니다. 100% 정확성은 기대하기 힘들지만, HTTP 헤더에서 Accept Language에 첫번째로 설정된 값을 읽어서 이게 어느 나라 말이구나 대충 짐작을 하는 방법도 있긴 하겠지만요... 코드만 가지고는 힘들죠.
결론은, 제가 처음에 올린 테이블을 참조하셔서 UTF-8 인지 아닌지(아닌 경우에는 로컬 코드라는 말이겠지요.) 검사하는 루틴을 구현하시면 됩니다. 이 검사 루틴에서 UTF-8인 경우에는 로컬 코드로 인코딩을 해 주면 되지요.
그런데 이 방법보다는 로컬 코드인 경우에 UTF-8로 바꾸어 주는 것이 더 좋습니다. 왜냐하면 로컬코드의 문자 집합이 유니코드에 포함되기 때문이죠. 따라서 유니코드(UTF-8 )을 로컬 코드로 변환하게 되면 일부 잘려 나가는 글자가 생기게 됩니다.
UTF-8 관련 내용은 RFC-2279, HTTP 관련 내용은 RFC-2616을 참조하시면 됩니다.
일단, UTF-8인지 아닌지 구분하는 방법은,정확하게 구분하는 방법은
일단, UTF-8인지 아닌지 구분하는 방법은,
정확하게 구분하는 방법은 없고 heuristic하게 구분할 수 있습니다.
왼쪽 칼럼이 유니코드 값이고 오른쪽 칼럼이 UTF-8로 변환 되었을 때의 2진수 값입니다.
예를 들어, 한글인 경우에는 UCS-2에서 3번째 경우에 해당하므로 첫바이트의 시작이 1110으로 시작하는지 검사하고 이어서 오는 2개의 바이트가 10으로 시작하는지 검사하면 되겠죠. 한글인지 다른 언어인지 모르는 경우에는 표를 참조해서 규칙을 만들어야 겠지요.
1) U-00000000 - U-0000007F: 0xxxxxxx
2) U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
3) U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
4) U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5) U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6) U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
유니코드와 로컬 코드(예, KSX-1001)는 실제로 겹치는 부분이 많이 있기 때문에 유니코드인지 검사하는 방법은 없습니다. 그런데 실제로 일반적인 네트워크 스트림에서는 유니코드를 바로 사용하기가 힘들기 때문에 UTF-8로 인코딩을 해서 사용합니다. 예를 들어 '가'의 UCS-2 값은 0xAC00인데 첫 바이트는 0xAC이지만 두번째 바이트가 0x00이기 때문에 일반적인 환경에서는 NULL로 인식해 버리죠. 그래서 유니코드를 바로 사용하려면 명시적으로 UCS-2 나 UCS-4로 구분해 주어야 합니다.
같은 이유로 유니코드와 안시 코드 구분도 거의 불가능 하겠죠.
꼭 구분을 해야하는 경우라면, 적어도 이게 어느 나라 언어인지 정도는 미리 알려주어야 구분을 할 수 있을텐데요.
답변감사합니다 한번더부탁드립니다
안녕하세요
답변정말감사합니다
웹서버를 만들고있읍니다
근데여 익스플로러에서 url을항상utf-8로보냄 을체크하면
서버에서 url을받을경우 링크가 깨어져버립니다
url이 영어일경우는 상관없이 동작하는데여
한글이 포함될경우에는 링크가 작동을 하지않읍니다
이경우는 utf-8의체크를 헤제하면 또 됩니다
그러니까 utf-8을 체크할경우도 작동되게하고싶은데여
어떻게코드를 구해서 utf-8의 코드를 안시코드로 바꾸는데 성공을 했읍니다
근데여
이게 이제는 꺼꾸로 동작을합니다
즉 utf-8을체크했을경우에만 링크가 동작을하는겁니다
결론은
url 을받아서 이 url이 utf-8인지 를검사해서
utf-8일경우에만 utf-8 을 안시코드로 바꾸어야될것같읍니다
무조건 utf-8의코드를 안시코드로 바꾸는 작업을 진행하니
utf-8이아닐경우는 전혀다르게 변하는것같읍니다
물론 영어만 사용하면 전혀상관은 없는데
사용자들이 영어만사용한다는 보장은없을것같고
프로그래머입장에서 처리를 해줘야될것같읍니다
utf-8 이니 안시코드니 하는부분에 대해서 잘모르니까
무지 어렵읍니다
한번더 조언부탁드립니다
즐거운하루되세요
웹서버를 만드시고 계시는 군요.저도 예전에 회사에서 웹서버 비스무리(
웹서버를 만드시고 계시는 군요.
저도 예전에 회사에서 웹서버 비스무리(?)한거 개발한 적이 있었죠.
지금 문제는 UTF-8인지 안시코드(윈도우에서 사용되는 코드 말씀하시는 거 맞죠? 한글은 CP-949 같은...)인지 구분이 잘 안 되기 때문이네요.
일단, 웹브라우저에서 URL을 보내는 경우는 UTF-8과 로컬코드 이렇게 두 가지 경우 밖에 없습니다. 다양한 언어의 웹 브라우저를 처리해야 한다면 무척 문제가 어려워집니다. 로컬코드를 받아서 이게 어느 나라 말인가 판단하는 일은 거의 불가능합니다. 100% 정확성은 기대하기 힘들지만, HTTP 헤더에서 Accept Language에 첫번째로 설정된 값을 읽어서 이게 어느 나라 말이구나 대충 짐작을 하는 방법도 있긴 하겠지만요... 코드만 가지고는 힘들죠.
결론은, 제가 처음에 올린 테이블을 참조하셔서 UTF-8 인지 아닌지(아닌 경우에는 로컬 코드라는 말이겠지요.) 검사하는 루틴을 구현하시면 됩니다. 이 검사 루틴에서 UTF-8인 경우에는 로컬 코드로 인코딩을 해 주면 되지요.
그런데 이 방법보다는 로컬 코드인 경우에 UTF-8로 바꾸어 주는 것이 더 좋습니다. 왜냐하면 로컬코드의 문자 집합이 유니코드에 포함되기 때문이죠. 따라서 유니코드(UTF-8 )을 로컬 코드로 변환하게 되면 일부 잘려 나가는 글자가 생기게 됩니다.
UTF-8 관련 내용은 RFC-2279, HTTP 관련 내용은 RFC-2616을 참조하시면 됩니다.
안녕하세요 답변감사합니다
안녕하세요 답변감사합니다
포기하려구했었는데 가능할것같은 희망이 보이내여
복많이받으시구
즐거운하루되세요
댓글 달기