I created a simple program which writes in a unicode files some french text with accents!<div><div><i># -*- coding: cp1252 -*-</i></div><div><i>#!/usr/bin/python</i></div><div><i>'''</i></div><div><i>Created on 27 déc. 2010</i></div>
<div><i><br></i></div><div><i>@author: jpmena</i></div><div><i>'''</i></div><div><i>from datetime import datetime</i></div><div><i>import locale</i></div><div><i>import codecs</i></div><div><i>import os,sys</i></div>
<div><i><br></i></div><div><i>class Log(object):</i></div><div><i> log=None</i></div><div><i> def __init__(self,log_path,charset_log=None):</i></div><div><i> self.log_path=log_path</i></div><div><i> if(os.path.exists(self.log_path)):</i></div>
<div><i> os.remove(self.log_path)</i></div><div><i> #self.log=open(self.log_path,'a')</i></div><div><i> if charset_log is None:</i></div><div><i> self.charset_log=sys.getdefaultencoding()</i></div>
<div><i> else:</i></div><div><i> self.charset_log=charset_log</i></div><div><i> self.log=codecs.open(self.log_path, "a", charset_log)</i></div><div><i> </i></div><div><i> def getInstance(log_path=None):</i></div>
<div><i> print "encodage systeme:"+<b>sys.getdefaultencoding()</b></i></div><div><i> if Log.log is None:</i></div><div><i> if log_path is None:</i></div><div><i> log_path=os.path.join(os.getcwd(),'logParDefaut.log')</i></div>
<div><i> Log.log=Log(log_path)</i></div><div><i> return Log.log</i></div><div><i> </i></div><div><i> getInstance=staticmethod(getInstance)</i></div><div><i> </i></div><div><i> def p(self,msg):</i></div>
<div><i> aujour_dhui=datetime.now()</i></div><div><i> date_stamp=aujour_dhui.strftime("%d/%m/%y-%H:%M:%S")</i></div><div><i> print sys.getdefaultencoding()</i></div><div><i> unicode_str=u'%s : %s \n' % (date_stamp,msg.encode(self.charset_log,'replace'))</i></div>
<div><i> self.log.write(unicode_str)</i></div><div><i> return unicode_str</i></div><div><i> </i></div><div><i> def close(self):</i></div><div><i> self.log.flush()</i></div><div><i> self.log.close()</i></div>
<div><i> return self.log_path</i></div><div><i><br></i></div><div><i>if __name__ == '__main__':</i></div><div><i> l=Log.getInstance()</i></div><div><i> l.p("premier message de Log à accents")</i></div>
<div><i> Log.getInstance().p("second message de Log")</i></div><div><i> l.close()</i></div><div><br></div><div>I am using PyDev/Aptana for developping. Il Aptana lanches the program everything goes well!!! sys.getdefaultencoding() answers 'cp1252'</div>
<div><br></div><div>But if I execute the following batch file in a DOS console on my Windows VISTA:</div><div><br></div><div><div><i>@echo off</i></div><div><i>setlocal</i></div><div><i>chcp 1252</i></div><div><i>set PYTHON_HOME=C:\Python27</i></div>
<div><i>for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (</i></div><div><i> if "%%l"=="" (</i></div><div><i><span class="Apple-tab-span" style="white-space:pre"> </span> :: Windows XP</i></div>
<div><i><span class="Apple-tab-span" style="white-space:pre"> </span> set D=%%k%%j%%i</i></div><div><i><span class="Apple-tab-span" style="white-space:pre"> </span>) else (</i></div><div><i><span class="Apple-tab-span" style="white-space:pre"> </span> :: Windows NT/2000</i></div>
<div><i><span class="Apple-tab-span" style="white-space:pre"> </span> set D=%%l%%k%%j</i></div><div><i><span class="Apple-tab-span" style="white-space:pre"> </span>)</i></div><div><i>)</i></div><div><i>set PYTHONIOENCODING=cp1252:backslashreplace</i></div>
<div><i>%PYTHON_HOME%\python.exe "%~dp0\src\utils\Log.py"</i></div></div><div><br></div><div>the answer is:</div><div><div><i>C:\Users\jpmena\Documents\My Dropbox\RIF\Python\VelocityTransforms>generationPro</i></div>
<div><i>grammeSitePublicActuel.cmd</i></div><div><i>Page de codes active : 1252</i></div><div><i><b>encodage systeme:ascii</b></i></div><div><i>ascii</i></div><div><i>Traceback (most recent call last):</i></div><div><i> File "C:\Users\jpmena\Documents\My Dropbox\RIF\Python\VelocityTransforms\\src\</i></div>
<div><i>utils\Log.py", line 51, in <module></i></div><div><i> l.p("premier message de Log à accents")</i></div><div><i> File "C:\Users\jpmena\Documents\My Dropbox\RIF\Python\VelocityTransforms\\src\</i></div>
<div><i>utils\Log.py", line 40, in p</i></div><div><i> unicode_str=u'%s : %s \n' % (date_stamp,msg.encode(self.charset_log,'replac</i></div><div><i>e'))</i></div><div><i style="background-color: rgb(255, 255, 51);">UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 23: ordinal</i></div>
<div><i style="background-color: rgb(255, 255, 51);"> not in range(128)</i></div></div><div><br></div><div>sys.getdefaultencoding answers ascii so the encode function cannot encode the accent in 'à'</div><div><br>
</div><div><br></div><div>I am using Python27 because it is compatible with the actual versions of pyodbc (for accessinf a ACCESS database) and airspeed (Velocity Templates in utf-8)</div></div><div><br></div><div>The target is to launch airspeed applications via the Windows CRON</div>
<div><br></div><div>Can someone help me. I am really stuck!</div><div><br></div><div>Thanks...</div>