Umlaute in E-Mail Adressen kodieren (IDNA)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Umlaute in E-Mail Adressen kodieren (IDNA)

Beitrag von dige »

Hallo,

habe gerade das Problem eine E-Mail mit Umlauten nicht versenden zu können.
Nach langer Suche habe ich herausgefunden, dass diese IDNA kodiert werden
muss. Stichwort: punycode

Hier mal ein Online Converter: http://idnaconv.net/try-it.html

Hat dazu schon mal jemand was in Purebasic gemacht oder hat einen Tipp für eine Lib?

Ciao dige
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Den Online-Konverter verstehe ich nicht. Wenn ich da einen Umlaut angeben, kommt das hier: "We are sorry, but something went terribly wrong. Error Message: NAMEPREP: Prohibited input U+00000020". Und zwar als einzelner Text ohne Seitenlayout oder sowas.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

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

Beitrag von dige »

Probier mal den hier: https://www.charset.org/punycode.php

Hab jetzt noch eine Dll gefunden, die zwar für mIRC gedacht ist,
der aber auch der Quellcode beiliegt: http://xise.nl/mirc/idna.zip

Kommt aber nix gescheites zurück :-(

Code: Alles auswählen

;==========================================================================
; Generated with PureDLLHelper, Copyright ©2011 by Thomas <ts-soft> Schulz
;==========================================================================

Prototype  LoadDll(a)
Prototype  decode(a, b, c, d, e, f)
Prototype  encode(a, b, c, d, e, f)

Global LoadDll.LoadDll
Global decode.decode
Global encode.encode

Procedure.i idna_LoadDLL()
  Protected hDLL.i

  hDLL = OpenLibrary(#PB_Any, "idna.dll")
  If hDLL <> 0
    LoadDll = GetFunction(hDLL, "LoadDll")
    decode = GetFunction(hDLL, "decode")
    encode = GetFunction(hDLL, "encode")

    ProcedureReturn hDLL
  EndIf

  ProcedureReturn #False
EndProcedure

Define.s dummy.s = "-" + Space(255)

If idna_LoadDLL()
  OpenWindow(0, 0, 0, 100, 100, "" )
  Debug encode (WindowID(0), 0, @"abc@Übergröße.de", @dummy, 1, 1)
  Debug dummy
EndIf


"Papa, ich laufe schneller - dann ist es nicht so weit."
CodeBurg
Beiträge: 107
Registriert: 06.06.2011 22:53

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

Beitrag von CodeBurg »

NicTheQuick hat geschrieben:Den Online-Konverter verstehe ich nicht. Wenn ich da einen Umlaut angeben, kommt das hier: "We are sorry, but something went terribly wrong. Error Message: NAMEPREP: Prohibited input U+00000020". Und zwar als einzelner Text ohne Seitenlayout oder sowas.
Bei mir funktioniert es. Das denke ich zumindest, da ich ein Ergebnis erhalte, das ich allerdings Mangels Kenntnis der IDNA-Kodierung nicht verifizieren kann.

Aber die Zeichenfolge "äÄöÖüÜß" ergibt "xn--zcaja6ea0ba" nach IDNA-2008 und "xn--ss-uiaa4ga6ba" nach IDNA-2003.

Und "däsüsöhTäst@try.com" ergibt "xn--dsshtst-5wae1poc@try.com" (diesmal nur nach 2008).

Falls es zur Fehlerfindung beträgt: Windows 7 Pro (natürlich aktueller Patchlevel) mit Chrome 50.0.2661.102m.

@dige:
Sorry für OT, aber bei deinem Problem kann ich nicht helfen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Vielleicht solltest du beim Prototype mal die richtigen Typen angeben. Möglicherweise brauchst du auch die Pseudotypen, die automatisch utf8, utf16 oder ascii an die DLL weitergeben.
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 »

Der String wird in den gleichen Puffer geschrieben, alle anderen Parameter werden ignoriert.
Versuch es mal so (unicode):

Code: Alles auswählen

If idna_LoadDLL()
  OpenWindow(0, 0, 0, 100, 100, "" )
  encode(0, 0, @dummy, 0, 0, 0)  
  Debug dummy
  decode(0, 0, @dummy, 0, 0, 0)  
  Debug dummy
EndIf
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag von NicTheQuick »

Wer es selbst schreiben will. Im Standard findet man eine Beispiel-Implementierung in C: Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)
Benutzeravatar
JMaker
Beiträge: 102
Registriert: 19.01.2015 10:18

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

Beitrag von JMaker »

@Nic: Dann fang an :allright:
Ich benutze Pure Basic 5.30 auf Microsoft Windows 7.
Gruß
JM
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

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

Beitrag von NicknameFJ »

NicTheQuick hat geschrieben:Den Online-Konverter verstehe ich nicht. Wenn ich da einen Umlaut angeben, kommt das hier: "We are sorry, but something went terribly wrong. Error Message: NAMEPREP: Prohibited input U+00000020". Und zwar als einzelner Text ohne Seitenlayout oder sowas.
@NicTheQuick:
Ich glaube es liegt daran dass Du ein Leerzeichen mit im Text hast

U+00000020 als Hex Wert für 32 = das Leerzeichen

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

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

Beitrag von dige »

edel hat geschrieben:Der String wird in den gleichen Puffer geschrieben, alle anderen Parameter werden ignoriert.
Versuch es mal so (unicode):

Code: Alles auswählen

If idna_LoadDLL()
  OpenWindow(0, 0, 0, 100, 100, "" )
  encode(0, 0, @dummy, 0, 0, 0)  
  Debug dummy
  decode(0, 0, @dummy, 0, 0, 0)  
  Debug dummy
EndIf
Yeah!!! :D Funktioniert! Danke Edel!!!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten