Seite 3 von 3

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

Verfasst: 17.05.2016 14:07
von C h r i s :)
nö hab ich nicht. meine vorhin gestellte frage wurde schon beantwortet.

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

Verfasst: 17.05.2016 18:12
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

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

Verfasst: 18.05.2016 08:35
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

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

Verfasst: 18.05.2016 08:56
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)

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

Verfasst: 09.12.2024 16:57
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