From 95b9325222cc42e5800fc5cc8640f9478aab69be Mon Sep 17 00:00:00 2001 From: langfr Date: Wed, 8 Oct 2025 11:29:54 +0100 Subject: [PATCH] Use UTF-8 when creating new Strings from byte[]. --- Release_Notes.md | 2 +- .../ZUGFeRD/DAPullProvider.java | 2 +- .../ZUGFeRD/OXPullProvider.java | 2 +- .../ZUGFeRD/UBLDAPullProvider.java | 2 +- .../ZUGFeRD/ZUGFeRD1PullProvider.java | 2 +- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 4 +-- .../ZUGFeRD/ZUGFeRDImporter.java | 3 +- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 2 +- .../ZUGFeRD/CalculationTest.java | 5 ++-- .../ZUGFeRD/DeSerializationTest.java | 6 ++-- .../mustangproject/ZUGFeRD/ZF2PushTest.java | 30 +++++++++---------- .../org/mustangproject/ZUGFeRD/ZF2Test.java | 3 +- .../validator/ZUGFeRDValidator.java | 2 +- 13 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Release_Notes.md b/Release_Notes.md index 11b0040c..b4d273ee 100644 --- a/Release_Notes.md +++ b/Release_Notes.md @@ -166,7 +166,7 @@ can be used to get XML ``` ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); zf2p.generateXML(i); -String theXML = new String(zf2p.getXML()); +String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); ``` or can also be used with setTransaction to generate invoice PDFs straight away. ### Embedding ZF1 to ZF2 migration diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java index 9bac1b07..a3410681 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java @@ -182,7 +182,7 @@ public class DAPullProvider extends ZUGFeRD2PullProvider { // Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung) if (trans.getAdditionalReferencedDocuments() != null) { for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) { - final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData())); + final String documentContent = Base64.getEncoder().encodeToString(f.getData()); xml += "" + "" + f.getFilename() + "" + "916" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index f2a032f2..6fb384dc 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -257,7 +257,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider { // Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung) if (trans.getAdditionalReferencedDocuments() != null) { for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) { - final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData())); + final String documentContent = Base64.getEncoder().encodeToString(f.getData()); xml += "" + "" + f.getFilename() + "" + "916" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/UBLDAPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/UBLDAPullProvider.java index 128af5d2..3e39c51b 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/UBLDAPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/UBLDAPullProvider.java @@ -117,7 +117,7 @@ public class UBLDAPullProvider implements IXMLProvider { final StringWriter sw = new StringWriter(); Document document = null; try { - document = DocumentHelper.parseText(new String(ublData)); + document = DocumentHelper.parseText(new String(ublData, StandardCharsets.UTF_8)); } catch (final DocumentException e1) { LOGGER.error ("Failed to parse UBL", e1); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index 87e6f479..12fe60a7 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -91,7 +91,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider { final StringWriter sw = new StringWriter(); Document document = null; try { - document = DocumentHelper.parseText(new String(zugferdData)); + document = DocumentHelper.parseText(new String(zugferdData, StandardCharsets.UTF_8)); } catch (final DocumentException e1) { LOGGER.error ("Failed to parse ZUGFeRD data", e1); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 87ffb274..b67beecc 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -95,7 +95,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { final StringWriter sw = new StringWriter(); Document document = null; try { - document = DocumentHelper.parseText(new String(zugferdData)); + document = DocumentHelper.parseText(new String(zugferdData, StandardCharsets.UTF_8)); } catch (final DocumentException e1) { LOGGER.error("Failed to parse ZUGFeRD data", e1); } @@ -620,7 +620,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { // Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung) if (trans.getAdditionalReferencedDocuments() != null) { for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) { - final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData())); + final String documentContent = Base64.getEncoder().encodeToString(f.getData()); xml += "" + "" + f.getFilename() + "" + "916" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 7de7415e..3f2cd02d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -14,6 +14,7 @@ package org.mustangproject.ZUGFeRD; * @author jstaerk */ import java.io.*; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -479,7 +480,7 @@ public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter { return null; } - return new String(rawXML); + return new String(rawXML, StandardCharsets.UTF_8); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index cdfe1d29..3b819ece 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -1223,7 +1223,7 @@ public class ZUGFeRDInvoiceImporter { return null; } if (rawXML.length < 3) { - return new String(rawXML); + return new String(rawXML, StandardCharsets.UTF_8); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java index 680b312e..a26eb2e0 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java @@ -17,6 +17,7 @@ import javax.xml.transform.Source; import javax.xml.xpath.XPathExpressionException; import java.io.*; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -292,7 +293,7 @@ public class CalculationTest extends ResourceCase { zf2p.generateXML(invoice); - String theXML = new String(zf2p.getXML()); + String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); assertThat(theXML).valueByXPath("//*[local-name()='ActualAmount']") .asString() .isEqualTo("0.55");// test for issue #917 @@ -346,7 +347,7 @@ public class CalculationTest extends ResourceCase { zf2p.generateXML(invoice); - String theXML = new String(zf2p.getXML()); + String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); assertThat(theXML).valueByXPath("//*[local-name()='ActualAmount']") .asString() .isEqualTo("0.55");// test for issue #917 diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java index 6f0a910c..dc158a68 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java @@ -300,7 +300,7 @@ public class DeSerializationTest extends ResourceCase { ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); zf2p.setProfile(Profiles.getByName("XRechnung")); zf2p.generateXML(newInvoiceFromJSON); - String theXML = new String(zf2p.getXML()); + String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains("20180304")); assertTrue(theXML.contains(base64)); @@ -539,7 +539,7 @@ public class DeSerializationTest extends ResourceCase { ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); zf2p.setProfile(Profiles.getByName("XRechnung")); zf2p.generateXML(fromJSON); - String theXML = new String(zf2p.getXML()); + String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains("20241026")); } @@ -920,7 +920,7 @@ public class DeSerializationTest extends ResourceCase { ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); zf2p.setProfile(Profiles.getByName("XRechnung")); zf2p.generateXML(fromJSON); - theXML = new String(zf2p.getXML()); + theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8); } catch (Exception e) { exceptions = true; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 72a4127f..1defb4b3 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -162,7 +162,7 @@ public class ZF2PushTest extends TestCase { .setNumber(number) .addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(0)).setTaxExemptionReason("Kleinunternehmer gemäß §19 UStG").setTaxCategoryCode("E"), price, new BigDecimal(1.0)).addNote(theNote)) ); - String theXML = new String(ze.getProvider().getXML()); + String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains("