]> source.dussan.org Git - poi.git/commitdiff
Bug 53109: Correctly handle unicode strings in NameCommentRecord
authorDominik Stadler <centic@apache.org>
Mon, 1 Jun 2015 20:49:53 +0000 (20:49 +0000)
committerDominik Stadler <centic@apache.org>
Mon, 1 Jun 2015 20:49:53 +0000 (20:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1682999 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/NameCommentRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/53109.xls [new file with mode: 0644]
test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls [new file with mode: 0644]

index ed33c2d1f232ceb01157e4d1d16f1ea5abf68907..6b3c8d0bd5c6f1cb995cc46dec5979a48ec07117 100644 (file)
@@ -62,17 +62,27 @@ public final class NameCommentRecord extends StandardRecord {
     out.writeShort(field_4_name_length);
     out.writeShort(field_5_comment_length);
 
-    out.writeByte(0);
-    StringUtil.putCompressedUnicode(field_6_name_text, out);
-    out.writeByte(0);
-    StringUtil.putCompressedUnicode(field_7_comment_text, out);
+    boolean isNameMultiByte = StringUtil.hasMultibyte(field_6_name_text);
+    out.writeByte(isNameMultiByte ? 1 : 0);
+    if (isNameMultiByte) {
+        StringUtil.putUnicodeLE(field_6_name_text, out);
+    } else {
+        StringUtil.putCompressedUnicode(field_6_name_text, out);
+    }
+    boolean isCommentMultiByte = StringUtil.hasMultibyte(field_7_comment_text);
+    out.writeByte(isCommentMultiByte ? 1 : 0);
+    if (isCommentMultiByte) {
+        StringUtil.putUnicodeLE(field_7_comment_text, out);
+    } else {
+        StringUtil.putCompressedUnicode(field_7_comment_text, out);
+    }
   }
 
   @Override
   protected int getDataSize() {
     return 18 // 4 shorts + 1 long + 2 spurious 'nul's
-         + field_6_name_text.length()
-         + field_7_comment_text.length();
+         + (StringUtil.hasMultibyte(field_6_name_text) ? field_6_name_text.length()*2 : field_6_name_text.length())
+         + (StringUtil.hasMultibyte(field_7_comment_text) ? field_7_comment_text.length()*2 : field_7_comment_text.length());
   }
 
   /**
@@ -86,10 +96,16 @@ public final class NameCommentRecord extends StandardRecord {
     final int field_4_name_length = in.readShort();
     final int field_5_comment_length = in.readShort();
 
-    in.readByte(); //spurious NUL
-    field_6_name_text = StringUtil.readCompressedUnicode(in, field_4_name_length);
-    in.readByte(); //spurious NUL
-    field_7_comment_text = StringUtil.readCompressedUnicode(in, field_5_comment_length);
+    if (in.readByte() == 0) {
+        field_6_name_text = StringUtil.readCompressedUnicode(in, field_4_name_length);
+    } else {
+        field_6_name_text = StringUtil.readUnicodeLE(in, field_4_name_length);
+    }
+    if (in.readByte() == 0) {
+        field_7_comment_text = StringUtil.readCompressedUnicode(in, field_5_comment_length);
+    } else {
+        field_7_comment_text = StringUtil.readUnicodeLE(in, field_5_comment_length);
+    }    
   }
 
   /**
index df470f26cfb9d722153c8acfbf588bbcbb8001b8..659bb049bc37c82559ed0ce9fdfe82b66db20236 100644 (file)
@@ -2738,4 +2738,24 @@ public final class TestBugs extends BaseTestBugzillaIssues {
         }
         wb.close();
     }
+
+    @Test
+    public void test53109() throws IOException {
+        HSSFWorkbook wb = openSample("53109.xls");
+        
+        Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        assertNotNull(wbBack);
+        
+        wb.close();
+    }
+    
+    @Test
+    public void test53109a() throws IOException {
+        HSSFWorkbook wb = openSample("com.aida-tour.www_SPO_files_maldives%20august%20october.xls");
+        
+        Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        assertNotNull(wbBack);
+        
+        wb.close();
+    }
 }
diff --git a/test-data/spreadsheet/53109.xls b/test-data/spreadsheet/53109.xls
new file mode 100644 (file)
index 0000000..08b4dfe
Binary files /dev/null and b/test-data/spreadsheet/53109.xls differ
diff --git a/test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls b/test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls
new file mode 100644 (file)
index 0000000..90b0bd6
Binary files /dev/null and b/test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls differ