Autor Thema: Zeichensatzcodierung nach DXL Import  (Gelesen 6753 mal)

Sebastianh

  • Gast
Zeichensatzcodierung nach DXL Import
« 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

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Zeichensatzcodierung nach DXL Import
« Antwort #1 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).

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Sebastianh

  • Gast
Re: Zeichensatzcodierung nach DXL Import
« Antwort #2 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).

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Zeichensatzcodierung nach DXL Import
« Antwort #3 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.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Sebastianh

  • Gast
Re: Zeichensatzcodierung nach DXL Import
« Antwort #4 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 :)
« Letzte Änderung: 28.05.09 - 16:17:18 von Sebastianh »

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Zeichensatzcodierung nach DXL Import
« Antwort #5 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();
    }
  }
}
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Sebastianh

  • Gast
Re: Zeichensatzcodierung nach DXL Import
« Antwort #6 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.
« Letzte Änderung: 03.06.09 - 14:35:46 von Sebastianh »

Sebastianh

  • Gast
Re: Zeichensatzcodierung nach DXL Import
« Antwort #7 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?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz