diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java index 679a091d..6da66898 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java @@ -18,6 +18,8 @@ *********************************************************************** */ package org.mustangproject.ZUGFeRD; +import java.nio.charset.StandardCharsets; + public class CustomXMLProvider implements IXMLProvider { protected byte[] zugferdData; @@ -29,7 +31,7 @@ public class CustomXMLProvider implements IXMLProvider { } public void setXML(byte[] newData) { - String zf = new String(newData); + String zf = new String(newData, StandardCharsets.UTF_8); if (!zf.contains("CrossIndustry")) { throw new RuntimeException("ZUGFeRD XML does not contain ( + * Copyright 2019 Jochen Staerk + *

+ * Use is subject to license terms. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0. + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + *

+ * See the License for the specific language governing permissions and + * limitations under the License. + *

+ * ********************************************************************** + */ +package org.mustangproject.ZUGFeRD; + +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; +import org.mustangproject.CII.CIIToUBL; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UBLTest extends ResourceCase { + + public void testUBLBasic() { + + // the writing part + CIIToUBL c2u = new CIIToUBL(); + String sourceFilename = "factur-x.xml"; + File input = getResourceAsFile(sourceFilename); + File expectedFile = getResourceAsFile("ubl-conv-ubl-output-factur-x.xml"); + String expected = null; + String result = null; + try { + File tempFile = File.createTempFile("ZUGFeRD-UBL-", "-test"); + c2u.convert(input, tempFile); + expected = ResourceUtilities.readFile(StandardCharsets.UTF_8, expectedFile.getAbsolutePath()); + result = ResourceUtilities.readFile(StandardCharsets.UTF_8, tempFile.getAbsolutePath()); + } catch (IOException e) { + fail("Exception should not happen: "+e.getMessage()); + } + + + assertNotNull(result); + assertEquals(expected, result); + } +} diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/VisualizationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/VisualizationTest.java new file mode 100644 index 00000000..fe2afa7c --- /dev/null +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/VisualizationTest.java @@ -0,0 +1,69 @@ + +/** ********************************************************************** + * + * Copyright 2019 Jochen Staerk + * + * Use is subject to license terms. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *********************************************************************** */ +package org.mustangproject.ZUGFeRD; + +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; +import org.mustangproject.CII.CIIToUBL; + +import javax.xml.transform.TransformerException; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class VisualizationTest extends ResourceCase { + + public void testVisualizationBasic() { + + // the writing part + CIIToUBL c2u = new CIIToUBL(); + String sourceFilename = "factur-x.xml"; + File input = getResourceAsFile(sourceFilename); + + String expected = null; + String result = null; + try { + ZUGFeRDVisualizer zvi = new ZUGFeRDVisualizer(); + result = zvi.visualize(input.getAbsolutePath()); + + File expectedResult=getResourceAsFile("factur-x.html"); + expected = new String(Files.readAllBytes(expectedResult.toPath()), StandardCharsets.UTF_8); + + BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\jstaerk\\Desktop\\factur-x.html")); + writer.write(result); + writer.close(); + + } catch (TransformerException e) { + fail("Exception should not happen: "+e.getMessage()); + } catch (IOException e) { + fail("Exception should not happen: "+e.getMessage()); + } + + + + assertNotNull(result); + // Reading ZUGFeRD + assertEquals(expected, result); + } +} diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java index ac94775d..12d83ba2 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java @@ -31,6 +31,7 @@ import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.util.Date; import static org.xmlunit.assertj.XmlAssert.assertThat; @@ -58,7 +59,7 @@ public class XRTest extends TestCase { ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); zf2p.setProfile(Profiles.getByName("XRechnung")); zf2p.generateXML(i); - String theXML = new String(zf2p.getXML()); + String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains(" + + + + XRechnung + + + + +

+ +
+
+
+
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+
+
Informationen zum Käufer
+
+
+
Leitweg-ID:
+
AB321
+
+
+
Name:
+
Theodor Est
+
+
+
Straße / Hausnummer:
+
Bahnstr. 42
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
88802
+
+
+
Ort:
+
Spielkreis
+
+
+
Land:
+
DE
+
+
+
Kennung:
+
2
+
+
+
Schema der Kennung:
+
+
+
+
Name:
+
+
+
+
Telefon:
+
+
+
+
E-Mail-Adresse:
+
+
+
+
+
+
+
Informationen zum Verkäufer
+
+
+
Firmenname:
+
Bei Spiel GmbH
+
+
+
Straße / Hausnummer:
+
Ecke 12
+
+
+
Postfach:
+
+
+
+
Adresszusatz:
+
+
+
+
PLZ:
+
12345
+
+
+
Ort:
+
Stadthausen
+
+
+
Bundesland:
+
+
+
+
Ländercode:
+
DE
+
+
+
Kennung:
+
+
+
+
Schema der Kennung:
+
+
+
+
Name:
+
+
+
+
Telefon:
+
+
+
+
E-Mail-Adresse:
+
+
+
+
+
+
+
+
+
+
Rechnungsdaten
+
+
+
+
+
Rechnungsnummer:
+
RE-20201121/508
+
+
+
Rechnungsdatum:
+
21.11.2020
+
+
+
Rechnungsart:
+
380
+
+
+
Währung:
+
EUR
+
+
+

Abrechnungszeitraum:

+
+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
+
+
+
Projektnummer:
+
+
+
+
Vertragsnummer:
+
+
+
+
Bestellnummer:
+
+
+
+
Auftragsnummer:
+
+
+
+

Vorausgegangene Rechnungen:

+
+
+
+
+
+
+
+
+
Gesamtbeträge der Rechnung
+
+
+
Summe aller Positionen
+
netto
+
496,00
+
+
+
Summe Nachlässe
+
netto
+
+
+
+
Summe Zuschläge
+
netto
+
,00
+
+
+
Gesamtsumme
+
netto
+
496,00
+
+
+
Summe Umsatzsteuer
+
+
+
+
+
Summe Umsatzsteuer in Abrechnungswährung
+
+
75,04
+
+
+
Gesamtsumme
+
brutto
+
571,04
+
+
+
Gezahlter Betrag
+
brutto
+
,00
+
+
+
Rundungsbetrag
+
brutto
+
+
+
+
Fälliger Betrag
+
brutto
+
571,04
+
+
+
+
+
+
+
+
+
Aufschlüsselung der Umsatzsteuer auf Ebene der Rechnung
+
+
+
Umsatzsteuerkategorie: S
+
+
+
+
+
Gesamtsumme
+
netto
+
160,00
+
+
+
Umsatzsteuersatz
+
+
7.00%
+
+
+
Umsatzsteuerbetrag
+
+
11,20
+
+
+
+
Befreiungsgrund:
+
Kennung für den Befreiungsgrund:
+
+
+
+
+
+
Aufschlüsselung der Umsatzsteuer auf Ebene der Rechnung
+
+
+
Umsatzsteuerkategorie: S
+
+
+
+
+
Gesamtsumme
+
netto
+
336,00
+
+
+
Umsatzsteuersatz
+
+
19.00%
+
+
+
Umsatzsteuerbetrag
+
+
63,84
+
+
+
+
Befreiungsgrund:
+
Kennung für den Befreiungsgrund:
+
+
+
+
+
+
+
+
+
+
Zahlungsdaten
+
+
+
Skonto; weitere Zahlungsbedingungen:
+
Zahlbar ohne Abzug bis 12.12.2020
+
+
+
Fälligkeitsdatum:
+
12.12.2020
+
+
+
Code für das Zahlungsmittel:
+
42
+
+
+
Zahlungsmittel:
+
Bank transfer
+
+
+
Verwendungszweck:
+
+
+
+
+
+
Karteninformation
+
+
+
Kartennummer:
+
+
+
+
Karteninhaber:
+
+
+
+
+
+
+
+
+
+
Lastschrift
+
+
+
Mandatsreferenznr.:
+
+
+
+
IBAN:
+
+
+
+
Gläubiger-ID:
+
+
+
+
+
+
Überweisung
+
+
+
Kontoinhaber:
+
Max Mustermann
+
+
+
IBAN:
+
DE88200800000970375700
+
+
+
BIC:
+
COBADEFFXXX COBADEFFXXX
+
+
+
+
+
+
+
+
+
+
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+
+
Position 1
+
+
+
Freitext:
+
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
Nummer der Auftragsposition:
+
+
+
+
Kontierungshinweis:
+
+
+

Abrechnungszeitraum:

+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
Preiseinzelheiten
+
+
+
Menge
+
1.0000
+
+
+
Einheit
+
HUR
+
+
+
Preis pro Einheit (netto)
+
160,00
+
+
+
Gesamtpreis (netto)
+
160,00
+
+
+
+
+
Rabatt (netto):
+
+
+
+
Listenpreis (netto):
+
160,00
+
+
+
Anzahl der Einheit:
+
1.0000 1.0000
+
+
+
Code der Maßeinheit:
+
HUR
+
+
+
Umsatzsteuer:
+
S
+
+
+
Umsatzsteuersatz in Prozent:
+
7.00%
+
+
+
+
+
+
+
+
+
Nachlässe auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Nachlass (netto)
+
+
+
+
+
Grund des Nachlasses:
+
Code für den Nachlassgrund:
+
+
+
+
Zuschläge auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Zuschlag (netto)
+
+
+
+
+
Grund des Zuschlags:
+
Code für den Zuschlagsgrund:
+
+
+
+
+
+
+
+
Artikelinformationen
+
+
+
+
+
+
Bezeichnung:
+
Design (hours)
+
+
+
Beschreibung:
+
Of a sample invoice
+
+
+
Artikelnummer:
+
+
+
+
Artikelkennung des Käufers:
+
+
+

Eigenschaften des Artikels:

+
+
+
+
+
+
+
Artikelkennung:
+
+
+
+
Schema der Artikelkennung:
+
+
+
+
Code der Artikelklassifizierung:
+
+
+
+
Kennung zur Bildung des Schemas:
+
+
+
+
Version zur Bildung des Schemas:
+
+
+
+
Code des Herkunftslandes:
+
+
+
+
+
+
+
+
+
+
+
+
+
Position 2
+
+
+
Freitext:
+
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
Nummer der Auftragsposition:
+
+
+
+
Kontierungshinweis:
+
+
+

Abrechnungszeitraum:

+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
Preiseinzelheiten
+
+
+
Menge
+
400.0000
+
+
+
Einheit
+
H87
+
+
+
Preis pro Einheit (netto)
+
,79
+
+
+
Gesamtpreis (netto)
+
316,00
+
+
+
+
+
Rabatt (netto):
+
+
+
+
Listenpreis (netto):
+
,79
+
+
+
Anzahl der Einheit:
+
1.0000 1.0000
+
+
+
Code der Maßeinheit:
+
H87
+
+
+
Umsatzsteuer:
+
S
+
+
+
Umsatzsteuersatz in Prozent:
+
19.00%
+
+
+
+
+
+
+
+
+
Nachlässe auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Nachlass (netto)
+
+
+
+
+
Grund des Nachlasses:
+
Code für den Nachlassgrund:
+
+
+
+
Zuschläge auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Zuschlag (netto)
+
+
+
+
+
Grund des Zuschlags:
+
Code für den Zuschlagsgrund:
+
+
+
+
+
+
+
+
Artikelinformationen
+
+
+
+
+
+
Bezeichnung:
+
Ballons
+
+
+
Beschreibung:
+
various colors, ~2000ml
+
+
+
Artikelnummer:
+
+
+
+
Artikelkennung des Käufers:
+
+
+

Eigenschaften des Artikels:

+
+
+
+
+
+
+
Artikelkennung:
+
+
+
+
Schema der Artikelkennung:
+
+
+
+
Code der Artikelklassifizierung:
+
+
+
+
Kennung zur Bildung des Schemas:
+
+
+
+
Version zur Bildung des Schemas:
+
+
+
+
Code des Herkunftslandes:
+
+
+
+
+
+
+
+
+
+
+
+
+
Position 3
+
+
+
Freitext:
+
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
Nummer der Auftragsposition:
+
+
+
+
Kontierungshinweis:
+
+
+

Abrechnungszeitraum:

+
+
von:
+
+
+
+
bis:
+
+
+
+
+
+
Preiseinzelheiten
+
+
+
Menge
+
800.0000
+
+
+
Einheit
+
LTR
+
+
+
Preis pro Einheit (netto)
+
,02
+
+
+
Gesamtpreis (netto)
+
20,00
+
+
+
+
+
Rabatt (netto):
+
+
+
+
Listenpreis (netto):
+
,02
+
+
+
Anzahl der Einheit:
+
1.0000 1.0000
+
+
+
Code der Maßeinheit:
+
LTR
+
+
+
Umsatzsteuer:
+
S
+
+
+
Umsatzsteuersatz in Prozent:
+
19.00%
+
+
+
+
+
+
+
+
+
Nachlässe auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Nachlass (netto)
+
+
+
+
+
Grund des Nachlasses:
+
Code für den Nachlassgrund:
+
+
+
+
Zuschläge auf Ebene der Rechnungsposition
+
+
+
Grundbetrag (netto)
+
+
+
+
Prozentsatz
+
%
+
+
+
Zuschlag (netto)
+
+
+
+
+
Grund des Zuschlags:
+
Code für den Zuschlagsgrund:
+
+
+
+
+
+
+
+
Artikelinformationen
+
+
+
+
+
+
Bezeichnung:
+
Hot air „heiße Luft“ (litres)
+
+
+
Beschreibung:
+
+
+
+
Artikelnummer:
+
+
+
+
Artikelkennung des Käufers:
+
+
+

Eigenschaften des Artikels:

+
+
+
+
+
+
+
Artikelkennung:
+
+
+
+
Schema der Artikelkennung:
+
+
+
+
Code der Artikelklassifizierung:
+
+
+
+
Kennung zur Bildung des Schemas:
+
+
+
+
Version zur Bildung des Schemas:
+
+
+
+
Code des Herkunftslandes:
+
+
+
+
+
+
+
+
+
+
+
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+
+
Informationen zum Verkäufer
+
+
+
Abweichender Handelsname:
+
+
+
+
Bundesland:
+
+
+
+
Elektronische Adresse:
+
+
+
+
Schema der elektronischen Adresse:
+
+
+
+
Register-/Registriernummer:
+
+
+
+
Umsatzsteuer-ID:
+
DE136695976
+
+
+
Steuernummer:
+
+
+
+
Schema der Steuernummer:
+
+
+
+
Weitere rechtliche Informationen:
+
+
+
+
Code der Umsatzsteuerwährung:
+
+
+
+
+
+
+
+
+
+
+
Informationen zum Käufer
+
+
+
Abweichender Handelsname:
+
+
+
+
Bundesland:
+
+
+
+
Elektronische Adresse:
+
+
+
+
Schema der elektronischen Adresse:
+
+
+
+
Register-/Registriernummer:
+
+
+
+
Schema der Register-/Registriernummer:
+
+
+
+
Umsatzsteuer-ID:
+
+
+
+
Abrechnungsdatum der Umsatzsteuer:
+
+
+
+
Code des Umsatzsteuer-Abrechnungsdatums:
+
+
+
+
Kontierungsinformation:
+
+
+
+
+
+
+
+
+
+
+
Informationen zum Vertrag
+
+
+
Vergabenummer:
+
+
+
+
Kennung der Empfangsbestätigung:
+
+
+
+
Kennung der Versandanzeige:
+
+
+
+
Prozesskennung:
+
+
+
+
Spezifikationskennung:
+
urn:cen.eu:en16931:2017
+
+
+
Objektkennung:
+
+
+
+
Schema der Objektkennung:
+
+
+
+
+
+
+
+
+
+
Wir übernehmen keine Haftung für die Richtigkeit der Daten.
+
+
+
+
Rechnungsbegründende Unterlagen
+
+
+
+
+
+
+
+
+
Bearbeitungshistorie
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/library/src/test/resources/factur-x.xml b/library/src/test/resources/factur-x.xml new file mode 100644 index 00000000..44ce2bd5 --- /dev/null +++ b/library/src/test/resources/factur-x.xml @@ -0,0 +1,191 @@ + + + + + + urn:cen.eu:en16931:2017 + + + + RE-20201121/508 + 380 + + 20201121 + + + + + + 1 + + + Design (hours) + Of a sample invoice + + + + 160.0000 + 1.0000 + + + 160.0000 + 1.0000 + + + + 1.0000 + + + + VAT + S + 7.00 + + + 160.00 + + + + + + 2 + + + Ballons + various colors, ~2000ml + + + + 0.7900 + 1.0000 + + + 0.7900 + 1.0000 + + + + 400.0000 + + + + VAT + S + 19.00 + + + 316.00 + + + + + + 3 + + + Hot air „heiße Luft“ (litres) + + + + + 0.0250 + 1.0000 + + + 0.0250 + 1.0000 + + + + 800.0000 + + + + VAT + S + 19.00 + + + 20.00 + + + + + AB321 + + Bei Spiel GmbH + + 12345 + Ecke 12 + Stadthausen + DE + + + DE136695976 + + + + 2 + Theodor Est + + 88802 + Bahnstr. 42 + Spielkreis + DE + + + + + + + 20201110 + + + + + RE-20201121/508 + EUR + + 42 + Bank transfer + + DE88200800000970375700 + Max Mustermann + + + COBADEFFXXX + + + + 11.20 + VAT + 160.00 + S + 7.00 + + + 63.84 + VAT + 336.00 + S + 19.00 + + + Zahlbar ohne Abzug bis 12.12.2020 + + 20201212 + + + + 496.00 + 0.00 + 0.00 + 496.00 + 75.04 + 571.04 + 0.00 + 571.04 + + + + diff --git a/library/src/test/resources/ubl-conv-ubl-output-factur-x.xml b/library/src/test/resources/ubl-conv-ubl-output-factur-x.xml new file mode 100644 index 00000000..f5358a65 --- /dev/null +++ b/library/src/test/resources/ubl-conv-ubl-output-factur-x.xml @@ -0,0 +1,156 @@ + + + urn:cen.eu:en16931:2017:extended:urn:fdc:peppol.eu:2017:poacc:billing:3.0 + urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 + RE-20201121/508 + 2020-11-21 + 2020-12-12 + 380 + EUR + AB321 + + + + Bei Spiel GmbH + + + Ecke 12 + Stadthausen + 12345 + + DE + + + + DE136695976 + + VAT + + + + Bei Spiel GmbH + + + + + + + 2 + + + Theodor Est + + + Bahnstr. 42 + Spielkreis + 88802 + + DE + + + + Theodor Est + + + + + 2020-11-10 + + + Zahlbar ohne Abzug bis 12.12.2020 + + + 75.04 + + 160.00 + 11.20 + + S + 7.00 + + VAT + + + + + 336.00 + 63.84 + + S + 19.00 + + VAT + + + + + + 496.00 + 496.00 + 571.04 + 0.00 + 0.00 + 0.00 + 571.04 + + + 1 + 1.0000 + 160.00 + + Of a sample invoice + Design (hours) + + S + 7.00 + + VAT + + + + + 160.0000 + 1.0000 + + + + 2 + 400.0000 + 316.00 + + various colors, ~2000ml + Ballons + + S + 19.00 + + VAT + + + + + 0.7900 + 1.0000 + + + + 3 + 800.0000 + 20.00 + + + Hot air „heiße Luft“ (litres) + + S + 19.00 + + VAT + + + + + 0.0250 + 1.0000 + + + \ No newline at end of file diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java index 5d20e272..704ed669 100644 --- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java @@ -62,7 +62,7 @@ public class XMLValidator extends Validator { // file existence must have been checked before try { - zfXML = new String(XMLTools.removeBOM(Files.readAllBytes(Paths.get(name)))); + zfXML = new String(XMLTools.removeBOM(Files.readAllBytes(Paths.get(name))), StandardCharsets.UTF_8); } catch (IOException e) { ValidationResultItem vri = new ValidationResultItem(ESeverity.exception, e.getMessage()).setSection(9) diff --git a/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java b/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java index e8d976eb..b0fcbdef 100644 --- a/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java @@ -1,6 +1,7 @@ package org.mustangproject.validator; import java.io.*; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -166,7 +167,7 @@ public class ZUGFeRDValidator { byte[] content=Files.readAllBytes(file.toPath()); content= XMLTools.removeBOM(content); - String s=new String(content); + String s=new String(content, StandardCharsets.UTF_8); InputSource is = new InputSource(new StringReader(s)); Document doc = db.parse(is);