Sean Gillies
sgillies at frii.com
Thu Sep 18 15:45:32 EST 2003
On Thursday, September 18, 2003, at 02:25 PM, David Fraser wrote: > Sean Gillies wrote: > >> Hi, >> >> I'm running into problems with UnicodeEncodeErrors using >> mod_python-3.0.3 with >> Python 2.3 on OS X. Yes, I know I'm asking for trouble with this >> combination, >> but I'm leery of replacing Apple's Python 2.2 (which doesn't work >> with mod_python). >> All in all, my application is working, but will eventually (and >> unpredictably) >> stop and raise this error: >> >> Mod_python error: "PythonHandler mod_python.publisher" >> >> Traceback (most recent call last): >> >> File >> "/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ >> site- packages/mod_python/apache.py", line 332, in HandlerDispatch >> result = object(req) >> >> File >> "/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ >> site- packages/mod_python/publisher.py", line 201, in handler >> result = str(result) >> >> UnicodeEncodeError: 'ascii' codec can't encode character '\u3137' in >> position 412: ordinal not in range(128) >> >> Anybody else using Python 2.3 who has seen this? I really don't >> understand the error, >> it's always '\u3137', and I'm _not_ (to my knowledge) using any >> unicode strings. I am >> using Zope's Page Templates, but I don't see where the page templates >> would be introducing >> '\u3137' (the hangul letter tikeut?!). >> >> My module is published with no problems on Linux (KRUD) with >> mod_python-3.0.1 and >> Python 2.2.3, so I'm presently living with this problem on my >> notebook and counting >> on its absence on the server. >> >> Sean >> >> -- > > Try doing things like: > if type(result) == unicode: > result = result.encode('iso8859') > You can look up different encodings in the encodings module. The above > works well for me... > I think you should be able to get the browser's desired encodings from > the headers sent to the request. > > Hope that helps > David > David, Thanks for the suggestion. The Zope page template's __call__ method does indeed return unicode and I've made your change to publisher.py. Working good. I also thought about catching the UnicodeEncodeError like if result: try: result = str(result) except UnicodeEncodeError: result = str(result.encode('iso8859')) since str(result) wasn't raising an error every time. cheers, Sean -- Sean Gillies sgillies at frii dot com http://www.frii.com/~sgillies
|