Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 356753 - Exception when switching to design mode when 2-byte-char string(CJF in UTF-8) is used as a xml attribute in xwt file
Summary: Exception when switching to design mode when 2-byte-char string(CJF in UTF-8)...
Status: CLOSED INVALID
Alias: None
Product: z_Archived
Classification: Eclipse Foundation
Component: WindowBuilder (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Konstantin Scheglov CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-09-05 23:06 EDT by tangwei CLA
Modified: 2021-06-04 16:44 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description tangwei CLA 2011-09-05 23:06:10 EDT
Exception in design mode when use 2-byte-char string as attribute such as text for Label
stacktrace is:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字节的 UTF-8 序列的字节 2 无效。
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at org.eclipse.e4.xwt.internal.xml.ElementManager.doLoad(ElementManager.java:372)
	at org.eclipse.e4.xwt.internal.xml.ElementManager.load(ElementManager.java:289)
	at org.eclipse.e4.xwt.internal.core.Core.load(Core.java:670)
	at org.eclipse.e4.xwt.XWTLoader.loadWithOptions(XWTLoader.java:864)
	at org.eclipse.e4.xwt.XWT.loadWithOptions(XWT.java:486)
	at org.eclipse.wb.internal.xwt.parser.XwtParser.parse(XwtParser.java:187)
	at org.eclipse.wb.internal.xwt.editor.XwtDesignPage.parse(XwtDesignPage.java:32)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.internal_refreshGEF(XmlDesignPage.java:447)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.internal_refreshGEF(XmlDesignPage.java:386)
	at org.eclipse.wb.internal.core.xml.editor.UndoManager.refreshDesignerEditor(UndoManager.java:254)
	at org.eclipse.wb.internal.core.xml.editor.UndoManager.activate(UndoManager.java:85)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.setActive(XmlDesignPage.java:167)
	at org.eclipse.wb.internal.core.xml.editor.AbstractXmlEditor.pageChange(AbstractXmlEditor.java:649)
	at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:290)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774)
	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2745)
	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1432)
	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

Full context stack trace:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字节的 UTF-8 序列的字节 2 无效。
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at org.eclipse.e4.xwt.internal.xml.ElementManager.doLoad(ElementManager.java:372)
	at org.eclipse.e4.xwt.internal.xml.ElementManager.load(ElementManager.java:289)
	at org.eclipse.e4.xwt.internal.core.Core.load(Core.java:670)
	at org.eclipse.e4.xwt.XWTLoader.loadWithOptions(XWTLoader.java:864)
	at org.eclipse.e4.xwt.XWT.loadWithOptions(XWT.java:486)
	at org.eclipse.wb.internal.xwt.parser.XwtParser.parse(XwtParser.java:187)
	at org.eclipse.wb.internal.xwt.editor.XwtDesignPage.parse(XwtDesignPage.java:32)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.internal_refreshGEF(XmlDesignPage.java:447)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.internal_refreshGEF(XmlDesignPage.java:386)
	at org.eclipse.wb.internal.core.xml.editor.UndoManager.refreshDesignerEditor(UndoManager.java:254)
	at org.eclipse.wb.internal.core.xml.editor.UndoManager.activate(UndoManager.java:85)
	at org.eclipse.wb.internal.core.xml.editor.XmlDesignPage.setActive(XmlDesignPage.java:167)
	at org.eclipse.wb.internal.core.xml.editor.AbstractXmlEditor.pageChange(AbstractXmlEditor.java:649)
	at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:290)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774)
	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2745)
	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1432)
	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)



The chinese information in the 1st line is something like:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: the 2nd byte in 2 bytes UTF-8 sequence is invalid。


Something like in the com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read
The int b0 xor 0xFF, so even b0 is -1(end of file), then b0 is 255 after it xored the 0xFF
so it can't be recognized and the "invalidByte(1, 1, b0);" will be called to throw the above exception
But how can we solve it for CJK in UTF-8?


public int read()
    throws IOException
  {
    int c = this.fSurrogate;
    if (this.fSurrogate == -1)
    {
      int index = 0;

      int b0 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

      if (b0 == -1) {
        return -1;
      }

      if (b0 < 128) {
        c = (char)b0;
      }
      else if (((b0 & 0xE0) == 192) && ((b0 & 0x1E) != 0)) {
        int b1 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b1 == -1) {
          expectedByte(2, 2);
        }
        if ((b1 & 0xC0) != 128) {
          invalidByte(2, 2, b1);
        }
        c = b0 << 6 & 0x7C0 | b1 & 0x3F;
      }
      else if ((b0 & 0xF0) == 224) {
        int b1 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b1 == -1) {
          expectedByte(2, 3);
        }
        if (((b1 & 0xC0) != 128) || ((b0 == 237) && (b1 >= 160)) || (((b0 & 0xF) == 0) && ((b1 & 0x20) == 0)))
        {
          invalidByte(2, 3, b1);
        }
        int b2 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b2 == -1) {
          expectedByte(3, 3);
        }
        if ((b2 & 0xC0) != 128) {
          invalidByte(3, 3, b2);
        }
        c = b0 << 12 & 0xF000 | b1 << 6 & 0xFC0 | b2 & 0x3F;
      }
      else if ((b0 & 0xF8) == 240) {
        int b1 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b1 == -1) {
          expectedByte(2, 4);
        }
        if (((b1 & 0xC0) != 128) || (((b1 & 0x30) == 0) && ((b0 & 0x7) == 0)))
        {
          invalidByte(2, 3, b1);
        }
        int b2 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b2 == -1) {
          expectedByte(3, 4);
        }
        if ((b2 & 0xC0) != 128) {
          invalidByte(3, 3, b2);
        }
        int b3 = index == this.fOffset ? this.fInputStream.read() : this.fBuffer[(index++)] & 0xFF;

        if (b3 == -1) {
          expectedByte(4, 4);
        }
        if ((b3 & 0xC0) != 128) {
          invalidByte(4, 4, b3);
        }
        int uuuuu = b0 << 2 & 0x1C | b1 >> 4 & 0x3;
        if (uuuuu > 16) {
          invalidSurrogate(uuuuu);
        }
        int wwww = uuuuu - 1;
        int hs = 0xD800 | wwww << 6 & 0x3C0 | b1 << 2 & 0x3C | b2 >> 4 & 0x3;

        int ls = 0xDC00 | b2 << 6 & 0x3C0 | b3 & 0x3F;
        c = hs;
        this.fSurrogate = ls;
      }
      else
      {
        invalidByte(1, 1, b0);
      }

    }
    else
    {
      this.fSurrogate = -1;
    }

    return c;
  }
Comment 1 Konstantin Scheglov CLA 2011-10-26 16:45:13 EDT
This is not WindowBuilder bug.
We just call XWT rendering engine and there are no other method to call, then one which accepts InputStream.

Actually, may be you just need to specify encoding in XML file header.