Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

win32com

3 réponses
Avatar
JB
Salut a tous,

Petit souci sous Win2003, Py2.4, win32com r212.

Je fais souvent du python dans des pages ASP. Ca marche très bien, mais
la sur cette (nouvelle) config j'ai un souci d'encodage :

<%@Language="Python"%>
<%
Response.Write("hého €") <- reponse illisible (hého € !)
Response.Write("<br>")
Response.Write(u"hého €") <- reponse parfaite
%>

Or en ASP classique, Response.Write("hého €") marche très bien.

Et, en build 202 avec Python 2.2 je n'avais pas ce problème non plus

Vu que j'ai deja une grosse appli en prod qui ne spécifie pas le 'u'
pour encoder les chaines, y a t il un moyen de revenir au comportement
antérieur ou de overrider Response.Write ?

J'essaie de créer une fonction custom que j'affecte à Response.Write :

rep = Response
def MyResponse(instr):
rep.Write(unicode(instr))
Response.Write = MyResponse

mais j'ai ce message d'erreur : "Objects of type 'function' can not be
converted to a COM VARIANT"

Donc a part me retaper les 100+ pages a la recherche d'output non
unicode encodés... je n'ai plus d'idées !


Merci pour vos lumières...


Julien

3 réponses

Avatar
Méta-MCI \(MVP\)
Bonsoir !

Et comme ça :

class MyResponse(object):
@classmethod
def Write(self,instr):
Response.Write(unicode(instr))

Puis, remplacer tous les:
Response.Write(...
par:
MyResponse.Write(...


--
@-salutations
--
Michel Claveau
Avatar
JB
Méta-MCI (MVP) a écrit :
Bonsoir !

Et comme ça :

class MyResponse(object):
@classmethod
def Write(self,instr):
Response.Write(unicode(instr))

Puis, remplacer tous les:
Response.Write(...
par:
MyResponse.Write(...



"@classmethod" permet de pouvoir appeler directement MyResponse.Write ?

Justement je voulais éviter d'avoir a tout ré-ecrire le code qui est
historiquement 'php-style' donc lourd a faire évoluer.

voici une solution d'override adaptée d'une proposition de Mark Hammond,
en attendant de voir d'ou ce changement d'encodage vient dans son code
ou dans windows... :

<%@Language="Python"%>
<%
def my_write(v):
if not v: return
if isinstance(v, bool) or isinstance(v, long) or isinstance(v, int):
Response.__dict__['_real_write'](str(v))
return
try:
v = v.decode("utf-8")
except UnicodeDecodeError:
# au cas ou chaine passée deja en unicode
pass

Response.__dict__['_real_write'](v)

Response.__dict__['_real_write'] = Response.Write
Response.__dict__['Write'] = my_write

Response.Write("héhoo €")
%>

je n'ai plus qu'a mettre ca dans mon include principal et ca roule....

vive django :p

ju.
Avatar
Méta-MCI \(MVP\)
Bonsoir !

OK, ça peut marcher.
Mais, perso, je n'aime pas trop jouer avec les homonymes de
fonctions/objets. C'est une source de confusion dans mon esprit étroit,
que je préfère éviter.

--
@-salutations
--
Michel Claveau