You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by jh...@apache.org on 2006/01/17 10:09:11 UTC
svn commit: r369729 - in /jakarta/poi/trunk/src:
java/org/apache/poi/hssf/record/RecordInputStream.java
java/org/apache/poi/hssf/record/UnicodeString.java
testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java
Author: jheight
Date: Tue Jan 17 01:08:23 2006
New Revision: 369729
URL: http://svn.apache.org/viewcvs?rev=369729&view=rev
Log:
BUG 38230 Fixed. Confirmed that the typecast from byte to char caused errors. Added testcase.
Modified:
jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/RecordInputStream.java
jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/UnicodeString.java
jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java
Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/RecordInputStream.java
URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/RecordInputStream.java?rev=369729&r1=369728&r2=369729&view=diff
==============================================================================
--- jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/RecordInputStream.java (original)
+++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/RecordInputStream.java Tue Jan 17 01:08:23 2006
@@ -249,7 +249,10 @@
for (int i=0;i<length;i++) {
if ((remaining() == 0) && (isContinueNext()))
nextRecord();
- char ch = (char)readByte();
+ byte b = readByte();
+ //Typecast direct to char from byte with high bit set causes all ones
+ //in the high byte of the char (which is of course incorrect)
+ char ch = (char)( (short)0xff & (short)b );
buf.append(ch);
}
return buf.toString();
Modified: jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/UnicodeString.java
URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/UnicodeString.java?rev=369729&r1=369728&r2=369729&view=diff
==============================================================================
--- jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/UnicodeString.java (original)
+++ jakarta/poi/trunk/src/java/org/apache/poi/hssf/record/UnicodeString.java Tue Jan 17 01:08:23 2006
@@ -230,19 +230,21 @@
in.setAutoContinue(false);
StringBuffer tmpString = new StringBuffer(field_1_charCount);
int stringCharCount = field_1_charCount;
- boolean isUncompressed = ((field_2_optionflags & 1) == 0);
+ boolean isCompressed = ((field_2_optionflags & 1) == 0);
while (stringCharCount != 0) {
if (in.remaining() == 0) {
if (in.isContinueNext()) {
in.nextRecord();
//Check if we are now reading, compressed or uncompressed unicode.
byte optionflags = in.readByte();
- isUncompressed = ((optionflags & 1) == 0);
+ isCompressed = ((optionflags & 1) == 0);
} else
throw new RecordFormatException("Expected continue record.");
}
- if (isUncompressed) {
- char ch = (char)in.readByte();
+ if (isCompressed) {
+ //Typecast direct to char from byte with high bit set causes all ones
+ //in the high byte of the char (which is of course incorrect)
+ char ch = (char)( (short)0xff & (short)in.readByte() );
tmpString.append(ch);
} else {
char ch = (char) in.readShort();
Modified: jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java
URL: http://svn.apache.org/viewcvs/jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java?rev=369729&r1=369728&r2=369729&view=diff
==============================================================================
--- jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java (original)
+++ jakarta/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestUnicodeWorkbook.java Tue Jan 17 01:08:23 2006
@@ -91,5 +91,41 @@
c3 = r.getCell((short)3);
assertEquals(c3.getCellFormula(), formulaString);
}
+
+ /** Tests Bug38230
+ * That a Umlat is written and then read back.
+ * It should have been written as a compressed unicode.
+ *
+ *
+ *
+ */
+ public void testUmlatReadWrite() throws Exception {
+ HSSFWorkbook wb = new HSSFWorkbook();
+
+ //Create a unicode sheet name (euro symbol)
+ HSSFSheet s = wb.createSheet("test");
+
+ HSSFRow r = s.createRow(0);
+ HSSFCell c = r.createCell((short)1);
+ c.setCellValue(new HSSFRichTextString("\u00e4"));
+
+ //Confirm that the sring will be compressed
+ assertEquals(c.getRichStringCellValue().getUnicodeString().getOptionFlags(), 0);
+
+ File tempFile = TempFile.createTempFile("umlat", "test.xls");
+ FileOutputStream stream = new FileOutputStream(tempFile);
+ wb.write(stream);
+
+ wb = null;
+ FileInputStream in = new FileInputStream(tempFile);
+ wb = new HSSFWorkbook(in);
+
+ //Test the sheetname
+ s = wb.getSheet("test");
+ assertNotNull(s);
+
+ c = r.getCell((short)1);
+ assertEquals(c.getRichStringCellValue().getString(), "\u00e4");
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
Mailing List: http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/