Python base64 uit database naar html/xml omzet probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pim.
  • Registratie: Mei 2001
  • Laatst online: 14-05 09:00

Pim.

Aut viam inveniam, aut faciam

Topicstarter
Hey guys, Python newbie hier :)


Ik ben een script aan het schrijven om een whatsapp database om te zetten naar een mooi overzichtelijke webpagina middels XML/XSL.
Het omzetten van standaard tekst is natuurlijk geen probleem maar bij het uitlezen van een stuk base64 encoded tekst krijg ik errors.

  File "C:\Users\pim\workspace\pyTest\WhatsApp\ReportMaker.py", line 91, in readdb
    f.write("<data><img src=\"data:image/png;base64," + row[6] + "\"></data>\n")
UnicodeEncodeError: 'ascii' codec can't encode character u'\ue40d' in position 72: ordinal not in range(128)


het grote probleem is dat de base 64 naar een string gezet moet worden en ik dan bovenstaande error krijg

Wat ik al geprobeerd heb:
Uit de database lezen en rechtstreeks in de xml zetten:
code:
1
f.write("<data><img src=\"data:image/png;base64," + row[6] + "\"></data>\n")

of
code:
1
f.write("<data><img src=\"data:image/png;base64," + base64.b64decode(row[6]) + "\"></data>\n")

of
code:
1
2
3
4
5
6
7
8
9
10
11
12
jpgtxt = base64.encodestring(open("in.jpg","rb").read())

f = open("jpg1_b64.txt", "w")
f.write(jpgtxt)
f.close()

# ----
newjpgtxt = open("jpg1_b64.txt","rb").read()

g = open("out.jpg", "w")
g.write(base64.decodestring(newjpgtxt))
g.close()


zoals gezegd............ ik zie het niet meer... iemand ??


edit:

als ik de row gewoon print krijg ik:

UnicodeEncodeError: 'charmap' codec can't encode character u'\ue40d' in position 34: character maps to <undefined>

[ Voor 6% gewijzigd door Pim. op 05-07-2012 09:11 ]

"The trouble with quotes from the Internet is that you can never know if they are genuine." - Elvis Presley | Niet met me eens ? DM ME


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 01-07 13:27
Zorg eerst eens dat je 'voorbeeldje' overeen komt met de error. Hij klaagt kennelijk over dat je binaire data als string probeert te concatten ofzo, maar dat doe je helemaal niet in je simpele voorbeeldje aan het eind. Werkt dat wel of niet, en zo niet, wat voor melding krijg je? Ik vermoed dat het stuk base64 encoded string utf-8 is en dat je het nog om moet zetten naar ASCII.

[ Voor 15% gewijzigd door Hydra op 05-07-2012 09:16 ]

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Pim.
  • Registratie: Mei 2001
  • Laatst online: 14-05 09:00

Pim.

Aut viam inveniam, aut faciam

Topicstarter
sorry, ligt waarschijnlijk aan mij maar ik snap je zin niet.....

bedoel je zoiets:
code:
1
f.write("<data><img src=\"data:image/png;base64," + str(base64.b64decode(row[6])) + "\"></data>\n")

"The trouble with quotes from the Internet is that you can never know if they are genuine." - Elvis Presley | Niet met me eens ? DM ME


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
1) je base64-encoded data is niet base64-encoded, want base64 is ASCII, en daar zal de automagische conversie goed mee moeten gaan.

2) probeer eens 'print repr(row)' in plaats van 'print row'.

Acties:
  • 0 Henk 'm!

  • Pim.
  • Registratie: Mei 2001
  • Laatst online: 14-05 09:00

Pim.

Aut viam inveniam, aut faciam

Topicstarter
oeeh, ziet er al een stuk beter uit maar ipv de hele tekst krijg ik nu:

u'\ue418'

als ik het met perl probeer krijg ik:
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

[ Voor 95% gewijzigd door Pim. op 05-07-2012 09:58 ]

"The trouble with quotes from the Internet is that you can never know if they are genuine." - Elvis Presley | Niet met me eens ? DM ME


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Pim. schreef op donderdag 05 juli 2012 @ 09:56:
oeeh, ziet er al een stuk beter uit maar ipv de hele tekst krijg ik nu:

u'\ue418'
Is dat row or row[6]? In het eerste geval zou row[6] ophalen namelijk niet mogen lukken.

Verder zal je gewoon even moeten debuggen wat er in row staat en waarom. De code waarmee je row bepaalt heb je namelijk niet vermeld ;-)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Pim. schreef op donderdag 05 juli 2012 @ 09:20:
code:
1
f.write("<data><img src=\"data:image/png;base64," + str(base64.b64decode(row[6])) + "\"></data>\n")
Even iets anders: je "hardcode" nu image/png; als ik je base64 string decode krijg ik echter een jpeg. Je zult dus waarschijnlijk de content-type ook nog ergens vandaan moeten (kunnen) halen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Pim.
  • Registratie: Mei 2001
  • Laatst online: 14-05 09:00

Pim.

Aut viam inveniam, aut faciam

Topicstarter
En weer een stukje verder :)


Ik heb om te testen de code iets veranderd en het ziet er als volgt uit

code:
1
f.write("<data>%s</data>\n"% (re.sub("&","&amp;", repr(row[6])) ) )


met dit resultaat:
u'Hey! Ik kan woensdag helemaal niet\ue40d ik ga al uit eten met....'
de u' wordt natuurlijk door de repr geplaatst

Ik denk dat het probleem is dat er in één veld zowel base64 images zijn (emoticons in chats) en gewone tekst

"The trouble with quotes from the Internet is that you can never know if they are genuine." - Elvis Presley | Niet met me eens ? DM ME


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
http://code.iamcal.com/php/emoji/
ctrl-f, U+E40D

Dat is wél een emoticon, maar niet base64 ;-)

Overigens, als je row unicode data bevat (itt ruwe bytes) dan moet je die encoden op het moment dat je 'm in een XML-document stopt.

Acties:
  • 0 Henk 'm!

  • Pim.
  • Registratie: Mei 2001
  • Laatst online: 14-05 09:00

Pim.

Aut viam inveniam, aut faciam

Topicstarter
Damn, nu voel ik me pas echt een newbie :+

Many thanks.

Nu even kijken hoe ik de images die doorgebuist worden ga ondervangen en de rest weer naar strings zetten ipv repr :)

"The trouble with quotes from the Internet is that you can never know if they are genuine." - Elvis Presley | Niet met me eens ? DM ME

Pagina: 1