 |
파이썬 마을 우리나라 파이썬 사용자들의 이야기 마을
|
|
| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
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
|
('제계정' 과 '어디', '누구누구'는 프라이버시 보호(?) 차원에서 대체한 것입니다. )
제 나름대로 해석해보면, 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')
|
해보시고 되면 알려주세요! |
|
| 위로 |
|
 |
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')
|
하면 반응이 있습니다. (에러가 나지 않습니다.)
이게 우찌된 일일까요? 뭔가 전혀 다른 데 문제가 있을 것 같다는 느낌이...  _________________ 파이썬 잘 모름. 배울라고 함. |
|
| 위로 |
|
 |
강태욱
가입: 올린 글: 134
|
올려짐: 2005 5월 11 5:57 pm 주제: |
|
|
CJKCodecs의 초기버젼에서 임포트쪽에 조금 문제가 있었던 걸로 기억하는데 그 탓이 아닌가 싶네요.
가능하다면 최신버젼의 CJKCodecs를 설치해 테스트 해 보시는게 좋을 것 같습니다. 파이썬 2.4를 쓸 수 있다면 더 좋겠지요.
- |
|
| 위로 |
|
 |
김창준
가입: 올린 글: 45
|
올려짐: 2005 5월 11 10:17 pm 주제: 혹시 |
|
|
| 웹에서 CGI로 실행되는 파이썬 인터프리터와 쉘에서 테스트하는 파이썬 인터프리터가 서로 다른 인스턴스가 아닐까요? |
|
| 위로 |
|
 |
uniculan
가입: 올린 글: 13
|
올려짐: 2005 5월 11 11:21 pm 주제: 으음 |
|
|
조언 주신 분들 감사합니다.
역시 잘 모르겠습니다. 초보자에게는 여러가지 어려움이... ㅜ.ㅜ
김창준 님의 조언도 고맙습니다만, '인스턴스'가 무슨 뜻인지 모르므로... 공부 좀 하고 삽질 더 하고 질문 다시 드리겠습니다. _________________ 파이썬 잘 모름. 배울라고 함. |
|
| 위로 |
|
 |
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파일이 에러안나오고 수행될 수
있는 버전의 파이썬을 구동해서 실행되도록 바꾸고 해보세요...
잘 해결되시길~ |
|
| 위로 |
|
 |
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 인코딩하는 홈페이지에서 제대로 보이겠습니다. (고수분들은 잘 아시겠습니다만...) _________________ 파이썬 잘 모름. 배울라고 함. |
|
| 위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
|