Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Sebastianh am 28.05.09 - 13:31:09

Titel: Zeichensatzcodierung nach DXL Import
Beitrag von: Sebastianh am 28.05.09 - 13:31:09
Hallo,

ich habe ein Dokument aus Notes heraus in ein DXL-File exportiert, und dieses dann wieder importiert. Soweit so gut. Der DXL-File hat auch den wunderbaren Header:
Code
<?xml version="1.0" encoding="utf-8"?>

Nur leider werden jetzt im NotesClient (7er) nach dem Import die Sonderzeichen (ä,ü,ö,ß,...) nicht mehr korrekt dargestellt. Ich habe am Importer keine Option gefunden, mit der ich Ihm mitteilen kann, welche Codierung er verwenden soll, und im Client habe ich den Zeichensatz auch auf UTF-8 umgestellt (allerdings erst nach dem Export), trotzdem bekomme ich die Sonderzeichen nicht korrekt angezeigt. Was mache ich falsch?

Gruß,

Sebastian
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: flaite am 28.05.09 - 13:49:37
Hatte ich nie Probleme mit. Hast du zufällig die dxl-Datei händisch mit einem Texteditor editiert und abgespeichert? Wenn ja könntest du es mit einem UTF-8 fähigen Texteditor nochmal versuchen (z.B. Textpad).

Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: Sebastianh am 28.05.09 - 14:10:12
die DXL Dateien werden manuell gar nicht angefasst. Der komplette Prozess läuft vollkommen automatisiert ab. Manueller Zugriff findet erst im Notes Client selber wieder statt. (ok, nicht ganz, der Aufruf der Import-Methode kommt aus einem Webinterface).
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: flaite am 28.05.09 - 15:06:54
Mmmh. Du manipulierst das DXL ja wohl automatisiert zwischen Export und re-Import. Vielleicht wird da irgendwas im Encoding geändert, ohne dass du dir darüber so recht im klaren bist. Kannst du vielleicht mal den code posten.
Ich seh weder bei DXLExporter noch bei DXLImporter eine Möglichkeit das Encoding (=Characterset) zu ändern.
Bin aber bisher davon ausgegangen, dass er das automatisch in UTF-8 umwandelt (exporter) und zurück in das Encoding des Dokuments/Design-Elements beim Import.
Ich hab heute leider keine Zeit, das mal kurz ausprobieren. Werd das aber am für mich sehr verlängerten WE machen.
Hatte auf verschiedenen Plattformen öfters Probleme mit dem Encoding. Bei DXL aber seltsamerweise nie. Letzteres kann auch mit Glück zu tun haben. Deshalb interessiert mich das.
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: Sebastianh am 28.05.09 - 16:08:50
Import:
Code
Stream stream = session.createStream();
dxlImporter = session.createDxlImporter();
boolean t1 = stream.open(filename);
if (t1) {
    dxlImporter.setReplaceDbProperties(false);
    dxlImporter.setReplicaRequiredForReplaceOrUpdate(false);
    dxlImporter.setAclImportOption(DxlImporter.DXLIMPORTOPTION_IGNORE);
    dxlImporter.setDesignImportOption(DxlImporter.DXLIMPORTOPTION_CREATE);
    dxlImporter.importDxl(stream, db);
    stream.close();
}

export:
Code
filename = "somestring";
DxlExporter dxlExporter = null;
try {
    dxlExporter = session.createDxlExporter();
    dxlExporter.setDoctypeSYSTEM(pfad_zur_dtd);
    String fileLocation = path + File.separator + filename;
    String dxl = dxlExporter.exportDxl(doc);
    File dxldatei = new File(fileLocation + ".dxl");
    FileOutputStream fos = new FileOutputStream(dxldatei);
    fos.write(dxl.getBytes("UTF-8"));
    fos.close();
    checkDXL(fileLocation + ".dxl");
}
("doc" ist hier vom Typ lotus.domino.Document und wird der Methode direkt übergeben.)

manipulation
Code
public boolean checkDXL(String filename){
	boolean retValue = false;
	try{
		Document doc = parse(filename);
		Element root = doc.getRootElement();
			
		getChildren(root);
		OutputFormat format = new OutputFormat("", true, "utf-8");
		FileOutputStream fos = new FileOutputStream(filename);
		XMLWriter writer = new XMLWriter(fos, format);
		writer.write(doc);
               ...
        }
}
("parse" ist hier nur das einlesen der DXL-Datei mit einem SAX-Parser)

das getchildren ist ziemlich lang, verändert aber eigentlich auch nur Werte innerhalb des bereits geparsten "xml", sollte also nix mehr mit der Codierung am Hut haben.

Danke schonmal :)
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: flaite am 02.06.09 - 00:03:27
Hi,

deine Extraktion in einen String und dann in Bytes und das dann in einen FileOutputStream ist umständlich.

Ich verstehe zur Zeit allerdings auch nicht, warum das nicht funktioniert.

Versuch mal den Export wie in der Hilfe:
Code
import lotus.domino.*;

public class JavaAgent extends AgentBase {

  public void NotesMain() {

    try {
      Session session = getSession();
      AgentContext agentContext = session.getAgentContext();

      // (Your code goes here) 
      // Get current database
      Database db = agentContext.getCurrentDatabase();
      // Export to file
      String filename = "c:\\dxl\\exporteddb.dxl";
      Stream stream = session.createStream();
      if (stream.open(filename)) {
        stream.truncate(); // Any existing file is erased
        DxlExporter exporter = session.createDxlExporter();
        System.out.println("Exported " +
           stream.writeText(exporter.exportDxl(db)) + 
          " bytes to " + filename);
      }
      else
        System.out.println("Cannot open " + filename);

    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: Sebastianh am 03.06.09 - 14:25:28
Hi,
das mit den Bytes mache ich, damit ich in den FileOutputStream schon UTF-8 Daten schreiben kann. Exportiere ich wie von Dir (der Hilfe) vorgeschlagen, bekomme ich beim späteren parsen der dxl-Datei mit dem dom-parser eine
Code
org.dom4j.DocumentException:
Invalid byte 2 of 3-byte UTF-8 sequence.
Exception.

da der Parser wohl über Zeichen wie äüöß stolpert!

(Sorry für meine späte Antwort, andere Projekte fordern derzeit mehr Zeit ein)

edit: ich vermute ja schon fast, dass der eigentliche Fehler beim wegschreiben der Datei nach der Manipulation liegt.
Titel: Re: Zeichensatzcodierung nach DXL Import
Beitrag von: Sebastianh am 04.06.09 - 15:42:22
folgender "Umweg" hat leider auch nicht weitergeholfen:

Code
OutputFormat format = new OutputFormat("", true, "UTF-8");
FileOutputStream fos = new FileOutputStream(filename);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
XMLWriter writer = new XMLWriter(osw, format);
writer.write(doc);

noch jemand eine Idee?