태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'Encoding'에 해당되는 글 1건

  1. 2008.09.26 MySQL -> XML: CDATA Sanitize? (2)

MySQL -> XML: CDATA Sanitize?

Tech 2008. 9. 26. 13:14
필요한 일이 있어서 MySQL 에 있는 데이터를 XML로 덤프하는 파이썬 코드를 만들었다. 약 30줄 정도 되는 간단한 코드인데, 눈으로 보기에는 문제 없어보이는 XML 파일이 계속 well-formed xml 이 아니라고 하는거다. XML library 를 가져다가 validation을 하면서 만든게 아니라 그냥 데이터만 템플릿에 맞게 찍어주며 덤프한거라서 ... 그렇다고 덤프 코드에 validation을 넣기도 귀찮고 해서... -0-

  1. 문제가 되는 라인은 <![CDATA[ ... ]]> 을 가지고 있다.
  2. 한국어, 일본어, 중국어 등이 섞여있는 데이터를 쓴다.

두가지로 미루어 추정해본 결과 CDATA에 넣어준 데이터가 있어서는 안되는 것이라 생각. 원래 CDATA가 이스케이핑 하기도 뭐하고, 이래저래 처리하기 귀찮은 애들을 그냥 때려박을때 쓰는 용도라고 생각해서 별 생각 안했는데, 그래도 xml 이 markup language라서 문제가 있을 수도 있을 것 같다. 어쨌든 텍스트를 넣는 것이니 텍스트에 태그를 닫는 문자셋이 나오면 그걸로 방법 아닌가!? 생각해보니 문제가 생길 소지가 다분하네... =_=

그래서 웹서핑 결과 이런 페이지를 발견. ... 어째 내가 하려던 것과 꼭 같은 일을 먼저 해보신 분이 적어둔 것이라 신빙성 짱! 그리하야,

def acceptable_char(c):
    code = ord(c)
    if code == 0x09 or code == 0x0a or code == 0x0d or \
       (0x20 <= code and code <= 0xd7ff) or \
       (0xe000 <= code and code <= 0xfffd) or \
       (0x10000 <= code and code <= 0x10ffff):
        return True
    return False

... ... ...

# 1. remove CDATA finish tag
content = content.replace("]]>", "")
# 2. decode
content = content.decode("utf-8", "replace")
# 3. filter out unacceptable characters
content = filter(acceptable, content)
# 4. encode
content = content.encode("utf-8", "replace")

... ... ...

이렇게 CDATA 안에 들어갈 내용을 처리해 주었다. 크게 두가지 작업이다. 우연히 들어갔을지도 모르는 <![CDATA[ 에 매칭되는 닫는 태그가 있는 경우 날리기, 허용되는 unicode range 에 있는것만 남기기다.

이렇게 해결봤음. 아, 귀찮아... =_=

'Tech' 카테고리의 다른 글

Parameter vs Argument  (3) 2009.01.21
GEB: MU puzzle  (4) 2008.10.20
MySQL -> XML: CDATA Sanitize?  (2) 2008.09.26
하위 디렉토리에 있는 모든 .svn 을 날리는 법  (5) 2008.09.11
Spiral number galaxy  (4) 2008.08.09
투명 필름 문제(Scheme)  (4) 2008.08.01
Trackbacks 0 : Comments 2
  1. Favicon of http://shurain.egloos.com 슈레인 2008.09.27 00:46 Modify/Delete Reply

    결론은 야매로 처리했다는거 아닌가여

  2. Favicon of http://deisys.net dgoon 2008.09.27 02:32 Modify/Delete Reply

    슈레인 // 세상이 야메. ... ㄷㄷㄷ 하지만, 저기서 XML validator 를 쓰면 너무 느려서 못써 ㅠㅠ

Write a comment