Umlaute in E-Mail Adressen kodieren (IDNA)

Für allgemeine Fragen zur Programmierung mit PureBasic.
C h r i s :)
Beiträge: 56
Registriert: 12.11.2015 17:41

Re: Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von C h r i s :) »

nö hab ich nicht. meine vorhin gestellte frage wurde schon beantwortet.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von edel »

Hier mal eine statische Lib (nur neu kompiliert) fuer ASCII Strings (Ja, Thomas... ich habe mein Passwort wieder vergessen :D)

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode
  CompilerError "Nur im ASCIIModus entpacken!"
CompilerEndIf
UseLZMAPacker()
lib.s = "XQAAAAEAEI8IqBly13UfTQKW4cLqw12n6GhsbDk9RAYsuB1xHd/xVMMxTigRfW+Ts8xg0sTXmety1bhZzSfsLCO4V6GrkTwUGDCT4DlbCOpFQ4rff7ijlpQUtiMjyECHWRaQAMBZI1hxVuXzbOM9Lnunl56"
lib.s + "11mSEKajQHqyUSBV3kmsq10U7/Wf7Zq9KNMlT9C1QA2yIVQo6uCt5CjSPvfwOexAwaPu/nb/kADwgSQz7Hq3/fEfIRDsTWp+smSOhMFwIs3gcY+g2GzgQ2SBYpYJ303NSq3hg9YaZvp/lUbkH7rT1xLJDRNwjACP"
lib.s + "M54npW5o4cDirADSijSRmAPOrfMVp5xmUnPNbus5cnv5HFxdd5k52MSH1ySCI0Yb5ki3ULsQIfPzJpVr1UbpSLWWiUrMoD/B7whpO6Erhy1YTw6GKHxmwfqKLMDwTviS+pj8efleJtDHB33ovrH+kKkgL5I9/gEc"
lib.s + "o68ku00kO9+HgBc4Qm8mfh6r7JtH5fpUSUvNlnjuugCV9L9dSF/Sbj7GqzonVlQpzftRuqJcH2LhSbEdiU7fO4LsKESHRe6Sufa9WNw/Nb+r6s+Va6oBcYa+XUI38g9FYn+SfheOtQVDSmuHHbnmzO/o7EEe5hCH"
lib.s + "6J9pm6drXv4EhzKeKoScjSvmgpF+8W5M1kx9TZKWw2mIdMp3tFVrQsUh8Xo3ItxVkuBmMNmuVw27vquER9Qg/rR1AagI0FQNxE/VKc7JdFcbmDu+fUABUzwXVp38YsFNQFfM/X7dUN8OIqzFtYzX9n0wPQiPVuGQ"
lib.s + "2gH1nC1ndxJrMG120SftDhZYvmjQNiVs9cb+41Cef9KWihLbhpd15GoF4dmardN35/+cIVunskGjEAOFiGl6HrNXNrp+AAJRD0FtD9IW7x5VqY2eGolYL+mYCU5pXwLvpezxXwXpsQ0/VUbV25lwNXJmE2SI7Ks1"
lib.s + "wBdN3N86Jm4mCLnZ+3+M25p1W8WjGe+nNkFVPTXZXY69BGUMO+DNkij37IT773C2ddVRTINoW0RI07M7IOQck8MrSBMB+fMRuh8gD0xg+VeBckHdFcFsIWw/T7bkGcFEBJHZjb9l+Te5EPKUmAttrHNgDzy5ASt8"
lib.s + "djkNG8QPYopj+WPfO7a8b5QGP6i2CuuxAZ1tE4cydc1kWbi+GEBvAZNAhnLEubZWYSfEY+qm5d121qmoCcdGLf7zSoHkrIVexjGSIvTmhMXMWPuuJw5goRpL7XBK1qhYAKcOnHuCD51hvMfEXWEoIYFD8KaG+bIl"
lib.s + "LhvofL9cJfbxUWTcTM9s2C2Rp1+R7TFYVzwNHBh/i2ORZhg8OWdc3Mgie9Kqw9Epw2sf+8IbTpUaU0/Ebi9z+ACnhMiTSdbhsiPERap32m84nxvjMhzyXBxxiBlU+GuKc39L7oHxD1FBikFzYJay05by6GFdRyA8"
lib.s + "hL6Pjw078ykGlDrM/gn3VET8aWZIGqE6S13T4Z7BOrEmz3rHsyAUAdqP4MdHRbqWYvjamn6lC8Jv2VHrENFC2/wgwHS51WtUJEchz1QrrkT5Z+Z00LEdAVL/ZxxGPjWZgVWBFos3Qff0AYOqGd1RZDtpHNyJHmVg"
lib.s + "/wxcx6JoS+B2Gz0HWXWmv1oHRuO2FJgJ+lQUTA+Uo9OetynGtxqDoY2hckCqk7FohdzVn2BebrFXYod1Sztoop67jQktBTuci37Q5hsom4ZntrQIXUuznqGOv3dOVU3i3zn+0GlFI3qw8n9lf6bPaK2kQvExxf+L"
lib.s + "JlgMxneHb/+vF+dxKPD7AWMTFOXZETC3jwb188YFBKpbE6ZMgKsoMCF9soC2t8zMMIMBFXQArnXf20ZCzblJ/Nc4EwjavS8son/jei2FxPaVw6ReMqhy6KsWIWPuSH69tD6SY8WTSXwr/QKlwS50z8GYER7rgLZD"
lib.s + "PbiwOAVZPZohkM+tgrMCF+m5fvQmt21raVR6yeqN3WJftHGYMqQ11YZhFNbjiIP+KVE1jU4bzzZRXhdSkMcz50aGCdoqNIF5jbRgyM8ptgEeS4jbdewb2Rq3bla+VhkPCS9XOFGe1CMt+vddqH29LTYSZq4Gkzax"
lib.s + "wMp/oV8PhJIy4T39tzoeYasDnYmOS6TDjgs9xGzLFw7nPlYS4HXI5yIdoZ0djv5GpiZCSHa5Ut4qnzL2+wecZgh59OCPK1el/SCNq4kob4wclDKjEfVu6uAQiDtMmi7KWlkNAigkF7xWMNjBoPzHw4Ij0YofPnSx"
lib.s + "rkhhL9Iz+sB3vwCLtd1VxuOaAaDbylutiRLgRYUj+C2SsXmMBSzD+Arfulzni/BXpvZkyUk27zcZ/5WWB9lqeQvfnyaevjL4VGkkpgoPdWaurrJzQQSJk5Udxkv7Nai1iEOy/EBgtd3s7gPRCwjmqglj++GJUxsA"
lib.s + "tUjnsZdxEA3P1kXk56WwYU9Pkt/lHooQe5P8V3Ptxv9SRUOMqwmDsGG/vpQgIG0KW2AmQRVDMFtDwfwn1e0lAlcFU6yICQsDu4/1Xn82mtOeWM7p7g+MILtj1JJ9yADnQFkBGtQ/Ba7sRBuCOJoKhR2w5tdQiqz+"
lib.s + "OUYJnlTbmtvPrISCfw16idTLZ/KOYd2L/Ww3vAA=="

mem = AllocateMemory(Len(lib))
size = Base64Decoder(@lib, Len(lib), mem, Len(lib))
out = AllocateMemory(size*2)
size = UncompressMemory(mem,size,out,size*2,#PB_PackerPlugin_Lzma) 
file.s = SaveFileRequester("", "idna.lib", "",0)
If file.s
  If CreateFile(0, file)
    WriteData(0, out, size)
    CloseFile(0)
  EndIf
  
EndIf


Das ganze kannst du dann so aufrufen :

Code: Alles auswählen

Import "idna.lib"
  decode(a, b, c, d, e, f)
  encode(a, b, c, d, e, f)
EndImport

dummy.s = "abc@Übergröße.de"

encode(0, 0, @dummy, 0, 0, 0)  
Debug dummy
decode(0, 0, @dummy, 0, 0, 0)  
Debug dummy
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von dige »

Danke schon mal an alle für die Hilfe!!

@ts-soft: da passiert leider nix. Es wird nichts umcodiert.

@Edel: Super! Mit der Lib funktionierts sehr gut.

Das das Ergebnis über den gleichen Speicherbereich verfügbar ist, scheint mir kritisch.
Vermutlich ist es besser, einen größeren Speicherbereich anzulegen, damit es nicht
kracht, wenn der kodierte String größer wird:

Code: Alles auswählen

Import "idna.lib"
  decode(a, b, c, d, e, f)
  encode(a, b, c, d, e, f)
EndImport

dummy.s = "abc@Übergröße.de"

Procedure.s PunyCode (txt.s)
  Protected *mem = AllocateMemory(Len(txt)*2)
    
  PokeS(*mem, txt)
  encode(0, 0, *mem, 0, 0, 0) 
  txt = PeekS(*mem)
  FreeMemory(*mem)
  
  ProcedureReturn txt
EndProcedure

Debug PunyCode(dummy)
;encode(0, 0, @dummy, 0, 0, 0) 
;Debug dummy
; decode(0, 0, @dummy, 0, 0, 0) 
; Debug dummy
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von dige »

Mit korrekter E-Mail Kodierung:

Code: Alles auswählen

Import "idna.lib"
  decode(a, b, c, d, e, f)
  encode(a, b, c, d, e, f)
EndImport

dummy.s = "abc@Café.org"

Procedure.s PunyCode (txt.s, flags = 0) ; 0 - Endcode, 1 - Decode
  Protected *mem, n = Len(txt)
  
  If n > 0
    
    ; Use 4x memory size, coz encoding will inflate the string
    *mem = AllocateMemory(n*4)
    PokeS(*mem, txt)
    
    If flags
      decode(0, 0, *mem, 0, 0, 0) 
    Else
      encode(0, 0, *mem, 0, 0, 0) 
    EndIf
    
    txt = PeekS(*mem)
    FreeMemory(*mem)
  EndIf
  
  ProcedureReturn txt
EndProcedure

Procedure.s EmailEncode (txt.s)
  Protected email_name.s, email_domain.s
  
  ; if email, encode only the host part
  If FindString(txt, "@", 2)
    email_name = StringField(txt, 1, "@")
    txt = StringField(txt, 2, "@")
    email_domain = GetExtensionPart(txt)
    txt = Mid(txt, 1, Len(txt) - Len(email_domain) - 1)
  EndIf
  
  txt = PunyCode(txt)
  
  If email_name <> ""
    txt = email_name + "@" + txt + "." + email_domain
  EndIf
  
  ProcedureReturn txt
EndProcedure

Debug EmailEncode(dummy)
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von dige »

Update für Purebasic (Unicode Version)

Code: Alles auswählen

Procedure.s PunyCode (txt.s, flags = 0) ; 0 - Endcode, 1 - Decode
  Protected *mem, n, *Ascii
    
  *Ascii = Ascii(txt)
  
  If *Ascii
    ; Use 4x memory size, coz encoding will inflate the string
    n = MemorySize(*Ascii) * 4
    *mem = AllocateMemory(n)
  EndIf
  
  If *mem
    CopyMemory(*Ascii, *mem, MemorySize(*Ascii))
    
    If flags
      decode(0, 0, *mem, 0, 0, 0) 
    Else
      encode(0, 0, *mem, 0, 0, 0) 
    EndIf
    
    txt = PeekS(*mem, -1, #PB_Ascii)
    FreeMemory(*mem)
  endif  
  
  If *Ascii
    FreeMemory(*Ascii)
  endif
  
  ProcedureReturn txt
EndProcedure
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten