UTF-16LE String aus LDAP lesen und als ISO-8859-1 in DB speichern?

  • Themenstarter Themenstarter tuxedo
  • Beginndatum Beginndatum
T

tuxedo

Gast
Hallo zusammen,

folgendes Problem:

Ich muss aus einem fremd-LDAP Benutzernamen auslesen. Klappt soweit ganz gut:

Kleines Beispiel:
Java:
String givenName = "";
Attributes personAttributes = ctx.getAttributes(personContextName);
Attribute attribGivenName = personAttributes.get("givenName");
if (attribGivenName!=null) {
    givenName = attribGivenName.get().toString();
}

Ziel ist es, den Namen in eine PostgresDB zu speichern.

Laut des LDAP-Verwalters, ist das Encoding auf dem LDAP-Server auf UTF-16LE eingestellt.
Die Datenbank läuft mit ISO-8859-1 Encoding.
Die JVM läuft mit ISO-8859-1 Encoding.

Wenn ich mir den Namen auf der Konsole ausdrucke, dann wird ein Testbenutzername, welcher "äöü ÄÖÜ" lauten sollte, mit "äöü Ã?Ã?Ã?" ausgedruckt.

Ich vermute ich muss der LDAP-Verbindung beibringen, mit welchem Encoding sie arbeiten muss (damit gleich beim lesen von UTF-16 in ISO-8859-1 gewandelt wird). Hab schon gegoogelt, komme aber auf keinen grünen Zweig. In vielen Hilfeseiten zum Thema encoding wird nur geschrieben, dass man die bytes lesen, und diese dann encoden soll. Aber hier geht's ja um LDAP, und da komm ich irgendwie nur an den bereits "verpfuschten" String dran.

Any ideas?

Gruß
Alex
 
Und was ist wenn du dir den String als byte array ausgibts und damit wiederum ein String mit UTF 16LE erzeugst? Kommt da immer noch bullshit an?
 
Hib mittlerweile folgendes herausgefunden:

Im LDAP ist der String "ä" nicht mit 2 Bytes, wie es für UTF16 üblich wäre, sondern mit 4 Bytes hinterlegt. Offenbar wird da schon mit dem falschen Encoding in den LDAP geschrieben.

Daneben lässt sich der LDAP Verbindungsconfig sagen, welches Attribut welchen Typ hat. So kann man ein String-Attribut in ein Byte[] Attribut umdefinieren und so ein byte[] auslesen, welches ich dann mit dem richtigen Encoding in einen String wandeln kann:

Java:
Properties env = new Properties();
...
env.put("java.naming.ldap.attributes.binary", "givenName");
...
ctx = new InitialDirContext(env);
...
Attributes personAttributes = ctx.getAttributes(personContextName);
Attribute attribGivenName = personAttributes.get("givenName");
if (attribGivenName!=null) {
    givenName = new String((byte[])attribGivenName.get(), "UTF16");
}

Gehe davon aus, dass wenn der LDAP Betreiber da korrekte Werte rein schreibt, ich mit dieser Lösung auch wieder korrekte Werte raus bekomme.

Und was ist wenn du dir den String als byte array ausgibts und damit wiederum ein String mit UTF 16LE erzeugst? Kommt da immer noch bullshit an?

Jepp. Liegt aber wohl wie eben geschrieben daran, dass schon bullshit im LDAP steht. Aber auch wenn das nicht der Fall wäre, bin ich mir unsicher ob nicht schon das erste lesen des Wertes als String-Typ das ganze verfälscht. Besser ist es wohl den String als byte[] zu lesen, und dann mit dem korrekten Encoding einen String daraus zu machen.

- Alex
 

Neue Themen


Zurück
Oben