Browse Source

Bug 53109: Correctly handle unicode strings in NameCommentRecord

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1682999 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_13_BETA1
Dominik Stadler 9 years ago
parent
commit
f998d39515

+ 26
- 10
src/java/org/apache/poi/hssf/record/NameCommentRecord.java View 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);
}
}

/**

+ 20
- 0
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java View 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();
}
}

BIN
test-data/spreadsheet/53109.xls View File


BIN
test-data/spreadsheet/com.aida-tour.www_SPO_files_maldives%20august%20october.xls View File


Loading…
Cancel
Save