파이썬 마을 게시판 인덱스 파이썬 마을
우리나라 파이썬 사용자들의 이야기 마을
 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 
Google
python.or.kr Web

인코딩 문제 질문입니다.

 
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
uniculan



가입:
올린 글: 13

올리기올려짐: 2005 5월 11 1:38 pm    주제: 인코딩 문제 질문입니다. 인용과 함께 답변

요즘 제가 운영하는 조그만 사이트를 노스모크모인모인에서 모인모인 1.3.4 로 바꾸는 작업을 하고 있습니다. 그 중에 만난 난관 중에 쉽게 풀리지 않는 문제가 있어서 질문을 드립니다.

상황 설명을 하자면...

노스모크모인모인을 사용할 당시에 다른 곳의 rss를 불러와 위키페이지에 출력하는 조그만 매크로를 만들어 쓰고 있었습니다. Mark Pilgrim 씨의 feedparser 란 걸 이용한 것이었죠 (http://diveintomark.org/projects/feed_parser). planetplanet 이란 프로그램도 이걸 이용하고 있으니 아시는 분들은 많이 아실 겁니다.

이 feedparser를 MoinMoin 디렉토리에다 복사한 후 macro 디렉토리에 다음과 같은 코드를 가진 매크로 파일을 작성해서 사용하고 있었습니다.

코드:

# This macro requires FeedParser (by Mark Pilgrim, http://diveintomark.org/projects/feed_parser)

import re
from MoinMoin import feedparser

_arg_re_pattern = r'(?P<url>[^,]+)((?P<spacer>[,])(?P<option>[^,]+))?'

def execute(macro, text, args_re=re.compile(_arg_re_pattern)):
    if not text:
        return ('<p><strong class="error">URL Needed!</strong></p>')
    urls = args_re.match(text)
    url = urls.group('url')
    option = urls.group('option')
    data = feedparser.parse(url)
    channel = data['channel']
    items = data['items']

    if option == 'mini':
        result = '<b><a href="%s" target="_blank">%s</a></b>' %(
            channel.get('link', " "), channel.get('title', " "))

        for item in items:
            result += '<br><a href="%s">%s</a>' % (
                item.get('link', " "), item.get('title', " "))

    else:
        result = '<h2><a href="%s" target="_blank">%s</a> : %s </h2>' % (
            channel.get('link', "(none)"), channel.get('title', "(none)"), channel.get('description', " "))

        for item in items:
            result += '<h3><a href="%s">%s</a></h3><p>%s - %s</p>' % (
                item.get('link', "(none)"), item.get('title', "(none)"), item.get('description', " "), item.get('date', " "))

    return result



초보자가 만든 것이라 지저분하긴 하지만 어쨌든, 잘 돌아가고 있었습니다. 처음에는 euc-kr 로 인코딩된 rss 파일은 처리하지 못했는데, 입주해 있는 웹호스팅 업체에 cjkcodec을 설치해달라고 부탁했더니 별다른 추가작업없이 한글로 된 rss 파일도 잘 처리하더군요.

그런데...

이번에 MoinMoin 1.3.4 로 웹프로그램을 바꾸면서 문제가 생겼습니다. 똑같은 방식으로 feedparser 와 위 매크로 프로그램을 적당한(?) 곳에 집어넣었는데요. euc-kr 란 인코딩은 모르겠다고 배를 쨉니다. -_-

위키페이지에 나타난 에러메시지는 너무 길어서 다 적기는 거시기하구요... 대강의 줄기는 이렇습니다. 위키가 매크로를 호출하는 장면부터...

인용:

/home1/제계정/lib/python2.3/site-packages/MoinMoin/Page.py in send_page_content(self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestCGI instance>, Parser=<class MoinMoin.parser.wiki.Parser>, body=u'[[rss(http://blog.어디.net/누구누구/rss)]]\n\n----\n[RSS] | [RSS\ubaa8\uc74c] | RssMacro\n', needsupdate=0, format_args='', do_cache=1)

(중략)

/home1/제계정/lib/python2.3/site-packages/MoinMoin/formatter/base.py in macro(self=<MoinMoin.formatter.text_html.Formatter instance>, macro_obj=<MoinMoin.wikimacro.Macro instance>, name=u'rss', args=u'http://blog.어디.net/누구누구/rss')

(중략)

/home1/제계정/lib/python2.3/site-packages/MoinMoin/wikimacro.py in execute(self=<MoinMoin.wikimacro.Macro instance>, macro_name=u'rss', args=u'http://blog.어디.net/누구누구/rss')

(중략)

/home1/제계정/lib/python2.3/site-packages/MoinMoin/macro/rss.py in execute(macro=<MoinMoin.wikimacro.Macro instance>, text=u'http://blog.어디.net/누구누구/rss', args_re=<_sre.SRE_Pattern object>)

(중략)

/home1/제계정/lib/python2.3/site-packages/MoinMoin/feedparser.py in parse(uri=u'http://blog.어디.net/누구누구/rss', etag=None, modified=None, agent=None, referrer=None)

(중략)

/home1/제계정/lib/python2.3/site-packages/MoinMoin/feedparser.py in isWellFormed(data='<?xml version="1.0" encoding="EUC-KR" ?>\n<!-- g...56+09:00</dc:date>\n\t\t</item>\n\n\t</channel>\n</rss>\n')

(중략)

/var/tmp/python-2.3.3-root/usr/lib/python2.3/xml/sax/expatreader.py in parse(self=<xml.sax.expatreader.ExpatParser instance>, source=<xml.sax.xmlreader.InputSource instance>)

/var/tmp/python-2.3.3-root/usr/lib/python2.3/xml/sax/xmlreader.py in parse(self=<xml.sax.expatreader.ExpatParser instance>, source=<xml.sax.xmlreader.InputSource instance>)

/var/tmp/python-2.3.3-root/usr/lib/python2.3/xml/sax/expatreader.py in feed(self=<xml.sax.expatreader.ExpatParser instance>, data='<?xml version="1.0" encoding="EUC-KR" ?>\n<!-- g...56+09:00</dc:date>\n\t\t</item>\n\n\t</channel>\n</rss>\n', isFinal=0)

LookupError: unknown encoding: EUC-KR



('제계정' 과 '어디', '누구누구'는 프라이버시 보호(?) 차원에서 대체한 것입니다. Smile )

제 나름대로 해석해보면, feedparser 가 xml.sax 이하 모듈을 호출해서 데이터를 넘겨줬는데 xml/sax/expatreader.py 녀석이 EUC_KR 이란 인코딩이 당최 뭐냐? 하는 장면같습니다.

그런데 제가 이해하지 못하는 것은 제 계정에는 노스모크모인모인과 MoinMoin 1.3.4 가 같이 설치되어 있는고 둘다 똑같은 파이썬 패키지(2.3 버전)를 쓰는데 결과가 다르냐는 것입니다. 노스모크모인모인에서 사용한 위 매크로는 인코딩에 따라 투정부리지 않았는데 말이죠. 물론 cjkcodec 이 설치되어 있는 것은 확실합니다.

한가지 심증이 가는 것은 제 계정에 설치되어 있는 노스모크모인모인은 내부적으로나 HTML 출력으로 euc-kr 인코딩을 사용하는데 반해 MoinMoin 1.3.4 는 유니코드를 사용하는 데에서 오는 차이가 아닐까 싶습니다만... 그렇긴해도 설령 꼬부랑 문자(?)를 출력할 지언정 아예 euc-kr 이란 인코딩을 모르겠다고 나오니, 어디에서부터 손을 대야 할지 감이 오지 않습니다.

어디에 문제가 있다고 생각해야 할까요? 고수분들의 조언 부탁드리겠습니다.
_________________
파이썬 잘 모름. 배울라고 함.
위로
사용자 정보 보기 비밀 메시지 보내기    
gogamza



가입:
올린 글: 46

올리기올려짐: 2005 5월 11 2:10 pm    주제: 인코딩 문제 이군요. 인용과 함께 답변

기본 XML 데이터가 UTF-8 유니코드 이기 때문에 발생한게 아닌가 합니다.

대부분의 XML 파서는 euc-kr 한글 인코딩을 처리해주지 못하는게 당연하겠죠.
(처리해주는 파서 아시는분 알려주세요. 저도 필요하거든요..)

euc-kr등으로 된 xml 파일을 유니코드로 일괄 변환한 다음에 feed를 시켜봄이 어떨까 합니다.

코드:

u = unicode(s, 'euc-kr').encode('utf-8')


주의 할건 print 할때 다시 euc-kr로 변환을 시켜줘야한다는거죠.
코드:

print unicode(u, 'utf-8').encode('euc-kr')


해보시고 되면 알려주세요!
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
uniculan



가입:
올린 글: 13

올리기올려짐: 2005 5월 11 3:36 pm    주제: 아... 이거 난감하군요. 인용과 함께 답변

조언 감사합니다. 말씀대로 한번 해보려고 feedparser.py 를 좀 건드려봤습니다.

파싱하는 데이타로 주어진 변수 data를

코드:

udata = unicode(data, 'euc-kr').encode('utf-8')


이런 식으로 바꿔서 넣어봤습니다. 그런데 이번에는 새로 건드린 바로 그 줄에서 이런 에러가 나는군요.


인용:


/home1/제계정/lib/python2.3/site-packages/MoinMoin/feedparser.py in isWellFormed(data='<?xml version="1.0" encoding="EUC-KR" ?>\n<!-- g...56+09:00</dc:date>\n\t\t</item>\n\n\t</channel>\n</rss>\n')

204 if _debug: sys.stderr.write('entering isWellFormed\n')
205 source = InputSource()
206 udata = unicode(data, 'euc-kr').encode('utf-8')
207 source.setByteStream(StringIO(udata))
208 validator = WellFormedChecker()

udata undefined, unicode undefined, data = '<?xml version="1.0" encoding="EUC-KR" ?>\n<!-- g...56+09:00</dc:date>\n\t\t</item>\n\n\t</channel>\n</rss>\n', ).encode = <built-in method encode of str object>

LookupError: unknown encoding: euc-kr
__doc__ = 'Base class for lookup errors.'
__getitem__ = <bound method LookupError.__getitem__ of <exceptions.LookupError instance>>
__init__ = <bound method LookupError.__init__ of <exceptions.LookupError instance>>
__module__ = 'exceptions'
__str__ = <bound method LookupError.__str__ of <exceptions.LookupError instance>>
args = ('unknown encoding: euc-kr',)



이번에는 unicode 함수의 인수로 준 euc-kr을 못알아 먹겠다고 하는 것 같네요. unicode 함수도 모르는 눈치입니다.

혹시나 싶어서 python 프롬프트에서

코드:

>>>unicode ('한글', 'euc-kr')


하면 반응이 있습니다. (에러가 나지 않습니다.)

이게 우찌된 일일까요? 뭔가 전혀 다른 데 문제가 있을 것 같다는 느낌이... Rolling Eyes
_________________
파이썬 잘 모름. 배울라고 함.
위로
사용자 정보 보기 비밀 메시지 보내기    
강태욱



가입:
올린 글: 134

올리기올려짐: 2005 5월 11 5:57 pm    주제: 인용과 함께 답변

CJKCodecs의 초기버젼에서 임포트쪽에 조금 문제가 있었던 걸로 기억하는데 그 탓이 아닌가 싶네요.
가능하다면 최신버젼의 CJKCodecs를 설치해 테스트 해 보시는게 좋을 것 같습니다. 파이썬 2.4를 쓸 수 있다면 더 좋겠지요. Smile

-
위로
사용자 정보 보기 비밀 메시지 보내기    
김창준



가입:
올린 글: 45

올리기올려짐: 2005 5월 11 10:17 pm    주제: 혹시 인용과 함께 답변

웹에서 CGI로 실행되는 파이썬 인터프리터와 쉘에서 테스트하는 파이썬 인터프리터가 서로 다른 인스턴스가 아닐까요?
위로
사용자 정보 보기 비밀 메시지 보내기    
uniculan



가입:
올린 글: 13

올리기올려짐: 2005 5월 11 11:21 pm    주제: 으음 인용과 함께 답변

조언 주신 분들 감사합니다.

역시 잘 모르겠습니다. 초보자에게는 여러가지 어려움이... ㅜ.ㅜ

김창준 님의 조언도 고맙습니다만, '인스턴스'가 무슨 뜻인지 모르므로... Embarassed 공부 좀 하고 삽질 더 하고 질문 다시 드리겠습니다.
_________________
파이썬 잘 모름. 배울라고 함.
위로
사용자 정보 보기 비밀 메시지 보내기    
funy



가입:
올린 글: 27
소속: Wiz

올리기올려짐: 2005 5월 12 8:00 am    주제: 인용과 함께 답변

/usr 밑에서 python 파일을 찾아보세요..

혹시 복수개의 디렉토리에 서로 다른 버전의 python이
설치되어 있으신건 아닌지 모르겠습니다.

예를 들어 /usr/local/bin/python 은 2.2 버전이 설치되어 있고,
/usr/python23/bin/python은 2.3버전이 설치되어 있는 식으로요..

쉘프롬프트상에서 python을 쳐서 수행했을때 잘되는 결과
.py로 되어 있는 프로그램에서 에러가 나면..위 경우를 의심해보셔요

.py 맨 첫줄에 "#!/usr/bin/env python" 라고 되어 있으시면,
"#!/usr/local/bin/python" 등 해당 .py파일이 에러안나오고 수행될 수
있는 버전의 파이썬을 구동해서 실행되도록 바꾸고 해보세요...

잘 해결되시길~
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
uniculan



가입:
올린 글: 13

올리기올려짐: 2005 5월 12 11:45 am    주제: 오오... 정말이군요... 인용과 함께 답변

제가 입주해 있는 서버에는

/usr/bin/ 과 /usr/local/bin/ 에

모두 python 이 있었는데, 앞에 것이 코덱이 먹지 않는 것이었습니다. 제가 그럴리 없다고 생각했던 것은 둘 다 분명 python2.3으로 심볼릭링크 되어 있었던 때문이었는데요... 같은 버전의 파이썬으로 링크되어 있으니 당연히 차이가 없을 거라고 속단했던 것이죠. 그런데, 그럴 수도 있나요? 음... 잘 모르겠다는... 이 서버에 python2.2 가 깔려 있다가 2.3으로 업글했는데 그 때문이 아닌가 싶기도 하다는... 서버관리자에게 질문을 해봐야 겠습니다.

아... 여튼 조언주신 모든 분들께 감사드립니다.

지금 문제의 그 매크로는 ?????? 문자들로 범벅이 되긴 해도 여튼 작동은 됩니다. 인코딩을 euc-kr 에서 utf-8 로 바꾸는 작업만 하면 되겠습니다.

추가 :

위 매크로 파일에서 끝에서 두번째 줄에

코드:

    result = unicode(result, 'euc-kr').encode('utf-8')


를 삽입하면 utf-8 인코딩하는 홈페이지에서 제대로 보이겠습니다. (고수분들은 잘 아시겠습니다만...)
_________________
파이썬 잘 모름. 배울라고 함.
위로
사용자 정보 보기 비밀 메시지 보내기    
이전 글 표시:   
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다



Powered by phpBB © 2001, 2005 phpBB Group
회선/장비: Daum DNA , 관리: 장혜식,서상현