cvs diff HeaderRecord.java (in directory C:\apache-cvs\jakarta-poi\src\java\org\apache\poi\hssf\record\) Index: HeaderRecord.java =================================================================== RCS file: /home/cvspublic/jakarta-poi/src/java/org/apache/poi/hssf/record/HeaderRecord.java,v retrieving revision 1.8 diff -r1.8 HeaderRecord.java 76c76,77 < private String field_2_header; --- > private byte field_2_unicode_flag; > private String field_3_header; 122,123c123,133 < field_2_header = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string < LittleEndian.ubyteToInt(field_1_header_len)); --- > field_2_unicode_flag = data[ 2 + offset ]; > if(isMultibyte()) > { > field_3_header = StringUtil.getFromUnicodeHigh( > data,3 + offset,LittleEndian.ubyteToInt(field_1_header_len)); > } > else > { > field_3_header = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string > LittleEndian.ubyteToInt( field_1_header_len) ); > } 127a138,163 > * see the unicode flag > * > * @return boolean flag > * true:footer string has at least one multibyte character > */ > public boolean isMultibyte() { > return ((field_2_unicode_flag & 0xFF) == 1); > } > > /** > * check the parameter has multibyte character > * > * @param value string to check > * @return boolean result > * true:string has at least one multibyte character > */ > private static boolean hasMultibyte(String value){ > if( value == null )return false; > for(int i = 0 ; i < value.length() ; i++ ){ > char c = value.charAt(i); > if(c > 0xFF )return true; > } > return false; > } > > /** 148c184,186 < field_2_header = header; --- > field_3_header = header; > field_2_unicode_flag = > (byte) (hasMultibyte(field_3_header) ? 1 : 0); 172c210 < return field_2_header; --- > return field_3_header; 195a234,235 > short bytelen = (short)(isMultibyte() ? > getHeaderLength()*2 : getHeaderLength() ); 198c238 < ( short ) ((len - 4) + getHeaderLength())); --- > ( short ) ((len - 4) + bytelen)); 203c243,251 < StringUtil.putCompressedUnicode(getHeader(), data, 7 + offset); // [Shawn] Place the string in the correct offset --- > data[ 6 + offset ] = field_2_unicode_flag; > if(isMultibyte()) > { > StringUtil.putUncompressedUnicode(getHeader(), data, 7 + offset); > } > else > { > StringUtil.putCompressedUnicode(getHeader(), data, 7 + offset); // [Shawn] Place the string in the correct offset > } 216,217c264,265 < retval += getHeaderLength(); < return retval; --- > return (isMultibyte() ? > (retval + getHeaderLength()*2) : (retval + getHeaderLength())); 228c276,277 < rec.field_2_header = field_2_header; --- > rec.field_2_unicode_flag = field_2_unicode_flag; > rec.field_3_header = field_3_header; cvs diff FooterRecord.java (in directory C:\apache-cvs\jakarta-poi\src\java\org\apache\poi\hssf\record\) Index: FooterRecord.java =================================================================== RCS file: /home/cvspublic/jakarta-poi/src/java/org/apache/poi/hssf/record/FooterRecord.java,v retrieving revision 1.8 diff -r1.8 FooterRecord.java 76c76,77 < private String field_2_footer; --- > private byte field_2_unicode_flag; > private String field_3_footer; 122,123c123,133 < field_2_footer = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string < LittleEndian.ubyteToInt( field_1_footer_len) ); --- > field_2_unicode_flag = data[ 2 + offset ]; > if(isMultibyte()) > { > field_3_footer = StringUtil.getFromUnicodeHigh( > data,3 + offset,LittleEndian.ubyteToInt(field_1_footer_len)); > } > else > { > field_3_footer = new String(data, 3 + offset, // [Shawn] Changed 1 to 3 for offset of string > LittleEndian.ubyteToInt( field_1_footer_len) ); > } 127a138,163 > * see the unicode flag > * > * @return boolean flag > * true:footer string has at least one multibyte character > */ > public boolean isMultibyte() { > return ((field_2_unicode_flag & 0xFF) == 1); > } > > /** > * check the parameter has multibyte character > * > * @param value string to check > * @return boolean result > * true:string has at least one multibyte character > */ > private static boolean hasMultibyte(String value){ > if( value == null )return false; > for(int i = 0 ; i < value.length() ; i++ ){ > char c = value.charAt(i); > if(c > 0xFF )return true; > } > return false; > } > > /** 148c184,186 < field_2_footer = footer; --- > field_3_footer = footer; > field_2_unicode_flag = > (byte) (hasMultibyte(field_3_footer) ? 1 : 0); 172c210 < return field_2_footer; --- > return field_3_footer; 195a234,235 > short bytelen = (short)(isMultibyte() ? > getFooterLength()*2 : getFooterLength() ); 198c238 < ( short ) ((len - 4) + getFooterLength())); --- > ( short ) ((len - 4) + bytelen )); 202c242,250 < StringUtil.putCompressedUnicode(getFooter(), data, 7 + offset); // [Shawn] Place the string in the correct offset --- > data[ 6 + offset ] = field_2_unicode_flag; > if(isMultibyte()) > { > StringUtil.putUncompressedUnicode(getFooter(), data, 7 + offset); > } > else > { > StringUtil.putCompressedUnicode(getFooter(), data, 7 + offset); // [Shawn] Place the string in the correct offset > } 215c263,264 < return retval + getFooterLength(); --- > return (isMultibyte() ? > (retval + getFooterLength()*2) : (retval + getFooterLength())); 226c275,276 < rec.field_2_footer = field_2_footer; --- > rec.field_2_unicode_flag = field_2_unicode_flag; > rec.field_3_footer = field_3_footer;