]> source.dussan.org Git - poi.git/commitdiff
Bug 63323 -- improve handling of multibyte characters
authorTim Allison <tallison@apache.org>
Mon, 8 Apr 2019 19:51:16 +0000 (19:51 +0000)
committerTim Allison <tallison@apache.org>
Mon, 8 Apr 2019 19:51:16 +0000 (19:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1857135 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfGraphics.java
src/scratchpad/src/org/apache/poi/hwmf/record/HwmfText.java
src/scratchpad/testcases/org/apache/poi/hwmf/TestHwmfParsing.java

index 05f5d200be11fe3cd0f07e3eeadc0cd4bb4f3459..766f9020dff0220c3de6e62eaf525bdf89d7b800 100644 (file)
@@ -400,7 +400,11 @@ public class HwmfGraphics {
             }
         }
 
-        String textString = new String(text, charset).substring(0,length).trim();
+        String textString = "";
+        if (text != null) {
+            textString = new String(text, charset).trim();
+            textString = textString.substring(0, Math.min(textString.length(), length));
+        }
 
         if (textString.isEmpty()) {
             return;
index 061f5cfc66067e2d0db7fb67e3cad814b49e3f89..6af61b81ac5dec1f628552edcb8684469224da69 100644 (file)
@@ -395,7 +395,12 @@ public class HwmfText {
         }
 
         public String getText(Charset charset) throws IOException {
-            return new String(rawTextBytes, charset).substring(0, stringLength);
+            if (rawTextBytes == null) {
+                return "";
+            }
+            String ret = new String(rawTextBytes, charset);
+            return ret.substring(0,
+                    Math.min(ret.length(), stringLength));
         }
 
         public Point2D getReference() {
index 4a988250fef4c16cc355992cabcd7d0ea3ae6c49..763228429638a67e084acac0169e707e1896fc91 100644 (file)
@@ -35,6 +35,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Locale;
 import java.util.zip.ZipEntry;
@@ -238,12 +239,12 @@ public class TestHwmfParsing {
     }
 
     @Test
-    @Ignore("If we decide we can use the common crawl file attached to Bug 60677, " +
-            "we can turn this back on")
     public void testShift_JIS() throws Exception {
-        //TODO: move test file to framework and fix this
-        File f = new File("C:/data/file8.wmf");
-        HwmfPicture wmf = new HwmfPicture(new FileInputStream(f));
+        //this file derives from common crawl: see Bug 60677
+        HwmfPicture wmf = null;
+        try (InputStream fis = samples.openResourceAsStream("60677.wmf")) {
+            wmf = new HwmfPicture(fis);
+        }
 
         Charset charset = LocaleUtil.CHARSET_1252;
         StringBuilder sb = new StringBuilder();
@@ -263,4 +264,21 @@ public class TestHwmfParsing {
         String txt = sb.toString();
         assertContains(txt, "\u822A\u7A7A\u60C5\u5831\u696D\u52D9\u3078\u306E\uFF27\uFF29\uFF33");
     }
+
+    @Test
+    public void testLengths() throws Exception {
+        //both substring and length rely on char, not codepoints.
+        //This test confirms that the substring calls in HwmfText
+        //will not truncate even beyond-bmp data.
+        //The last character (Deseret AY U+1040C) is comprised of 2 utf16 surrogates/codepoints
+        String s = "\u666E\u6797\u65AF\uD801\uDC0C";
+        Charset utf16LE = StandardCharsets.UTF_16LE;
+        byte[] bytes = s.getBytes(utf16LE);
+        String rebuilt = new String(bytes, utf16LE);
+        rebuilt = rebuilt.substring(0, Math.min(bytes.length, rebuilt.length()));
+        assertEquals(s, rebuilt);
+        assertEquals(5, rebuilt.length());
+        long cnt = rebuilt.codePoints().count();
+        assertEquals(4, cnt);
+    }
 }