| Summary: | Exception when switching to design mode when 2-byte-char string(CJF in UTF-8) is used as a xml attribute in xwt file | ||
|---|---|---|---|
| Product: | z_Archived | Reporter: | tangwei |
| Component: | WindowBuilder | Assignee: | Konstantin Scheglov <Konstantin.Scheglov> |
| Status: | CLOSED INVALID | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | CC: | clayberg |
| Version: | unspecified | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | Windows XP | ||
| Whiteboard: | |||
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. |
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; }