diff --git a/src/java/org/apache/poi/hssf/record/NameCommentRecord.java b/src/java/org/apache/poi/hssf/record/NameCommentRecord.java index ed33c2d1f..6b3c8d0bd 100644 --- a/src/java/org/apache/poi/hssf/record/NameCommentRecord.java +++ b/src/java/org/apache/poi/hssf/record/NameCommentRecord.java @@ -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); + } } /** diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index df470f26c..659bb049b 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -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 index 000000000..08b4dfeec 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 index 000000000..90b0bd65e Binary files /dev/null and b/test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls differ