2011-12-12 21 views
5

मैं फ्लाई पर एक XML स्ट्रिंग (फ़ाइल से नहीं पढ़ रहा) प्राप्त करता हूं। फिर मैं इसे एफओपी के माध्यम से पीडीएफ में बदलने के लिए कोकून 3 का उपयोग करता हूं। मध्य ज़ेरिस में कहीं भी चलता है। जब मैं हार्डकोडेड सामान का उपयोग करता हूं तो सब कुछ काम करता है। जैसे ही मैंने डेटाबेस में एक जर्मन ऊमलायूट रख दिया और उस डेटा मैं के साथ मेरी एक्सएमएल को बेहतर बनाने के:मेरे पास यूटीएफ -8 है - लेकिन अभी भी "1-बाइट यूटीएफ -8 अनुक्रम का अमान्य बाइट 1"

Caused by: org.apache.cocoon.pipeline.ProcessingException: Can't parse the XML string. 
at org.apache.cocoon.sax.component.XMLGenerator$StringGenerator.execute(XMLGenerator.java:326) 
at org.apache.cocoon.sax.component.XMLGenerator.execute(XMLGenerator.java:104) 
at org.apache.cocoon.pipeline.AbstractPipeline.invokeStarter(AbstractPipeline.java:146) 
at org.apache.cocoon.pipeline.AbstractPipeline.execute(AbstractPipeline.java:76) 
at de.grobmeier.tab.webapp.modules.documents.InvoicePipeline.generateInvoice(InvoicePipeline.java:74) 
... 87 more 

Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. 
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684) 
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554) 

मैं तो मेरे एप्लिकेशन डिबग और पाया है बाहर, मेरी 'ए' (जो डेटाबेस frome आता है) है 1 9 6 का बाइट वैल्यू, जो हेक्स में सी 4 है। इस के अनुसार मैंने यह अपेक्षा की है: http://www.utf8-zeichentabelle.de/

मुझे नहीं पता कि मेरा कोड क्यों विफल रहता है।

मैं तो ऐसे ही स्वयं एक बीओएम जोड़ने के लिए, की कोशिश की है:

byte[] bom = new byte[3]; 
bom[0] = (byte) 0xEF; 
bom[1] = (byte) 0xBB; 
bom[2] = (byte) 0xBF; 
String myString = new String(bom) + inputString; 

मैं जानता हूँ कि यह वास्तव में अच्छा नहीं है, लेकिन मैं इसे करने की कोशिश की - निश्चित रूप से यह विफल रहा है। मैंने सामने एक एक्सएमएल हेडर जोड़ने की कोशिश की है:

<?xml version="1.0" encoding="UTF-8"?> 

जो भी असफल रहा। फिर मैंने इसे जोड़ा। अनुत्तीर्ण होना।

सब के बाद मैं ऐसा ही कुछ करने की कोशिश की:

xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8"); 

कौन सा है, वास्तव में कुछ भी नहीं कर रही है, क्योंकि यह पहले से ही UTF-8 है। फिर भी यह विफल रहता है।

तो ... कोई विचार क्या मैं गलत कर रहा हूं और जेरिस मुझसे क्या उम्मीद कर रहा है?

धन्यवाद ईसाई

+0

सहमत हुए, लेकिन यह मेरी मदद नहीं करता है। क्योंकि समस्याग्रस्त स्ट्रिंग जो डेटाबेस से आता है मेरी ओआरएम परत से बनाई गई है। इसके अलावा, इसमें 0xC4 है जो ठीक करना चाहिए, है ना? – Christian

+0

मैं MySQL का उपयोग करता हूं, तालिका और कॉलम utf8_general_ci के साथ एन्कोड किए जाते हैं। मैंने अपने jdbc कनेक्शन में उपयोग यूनिकोड = सत्य और वर्ण एन्कोडिंग = utf8 जोड़ा है। – Christian

+0

जब आप एक अलग एन्कोडिंग के साथ डीबी से कनेक्ट होने के लिए होते हैं तो जेडीबीसी कनेक्शन पर उन पैरामीटर को निर्दिष्ट करना एक अच्छा विचार नहीं हो सकता है - ऑटोडेटेक्शन गलत होने पर ही इसका उपयोग करें। डेटा लिखने के लिए आप क्या उपयोग करते हैं, और क्या यह एक बीएलओबी या वर्चर कॉलम है? – JBert

उत्तर

12

यदि आपके डेटाबेस में केवल एक ही बाइट है (मान 0xC4 के साथ) तो आप यूटीएफ -8 एन्कोडिंग का उपयोग नहीं कर रहे हैं।

चरित्र "लैटिन कैपिटल लिटर ए डायरेरेसिस" में कोड-पॉइंट मान यू +00 सी 4 है, लेकिन यूटीएफ -8 एक बाइट में एन्कोड नहीं कर सकता है। यदि आप यूटीएफ 8-zeichentabelle.de पर तीसरे कॉलम "यूटीएफ -8 (हेक्स।)" की जांच करते हैं तो आप देखेंगे कि यूटीएफ -8 एन्कोड्स जो 0xC3 84 (दो बाइट्स) के रूप में हैं।

कृपया अधिक जानकारी के लिए जोएल का लेख "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" पढ़ें।


संपादित करें: ईसाई ने स्वयं जवाब दिया; यह पता चला कि यह कोकून 3 SAX घटक में एक समस्या थी (मुझे लगता है कि यह अल्फा 3 संस्करण है)। यह पता चला है कि यदि आप XMLGenerator कक्षा में एक स्ट्रिंग के रूप में एक एक्सएमएल पास करते हैं, तो इस गड़बड़ी के कारण SAX पार्सिंग के दौरान कुछ गलत हो जाएगा।

if (XMLGenerator.this.logger.isDebugEnabled()) { 
    XMLGenerator.this.logger.debug("Using a string to produce SAX events."); 
} 
XMLUtils.toSax(new ByteArrayInputStream(this.xmlString.getBytes()), XMLGenerator.this.getSAXConsumer(); 

आप देख सकते हैं, कॉल getBytes() JRE का डिफ़ॉल्ट एन्कोडिंग के साथ एक बाइट सरणी जो तब पार्स करने के लिए असफल हो जायेगी पैदा करेगा:

मैं looked up the code कोकून-stax में वास्तविक समस्या खोजने के लिए। ऐसा इसलिए है क्योंकि एक्सएमएल खुद को यूटीएफ -8 होने की घोषणा करता है जबकि डेटा अब बाइट्स में फिर से है, और संभवतः आपके विंडोज कोडपेज का उपयोग कर रहा है।

समाधान के लिए, एक निम्न का उपयोग कर सकते हैं:

new org.apache.cocoon.sax.component.XMLGenerator(xmlInput.getBytes("UTF-8"), 
     "UTF-8"); 

यह सही आंतरिक कार्यों को गति प्रदान करेगा (के रूप में ईसाई एपीआई के साथ प्रयोग करके पता चला)।

मेरे पास अपाचे के बग ट्रैकर में opened an issue है।

संपादित 2: मुद्दा तय है और आगामी रिलीज में शामिल किया जाएगा।

+0

ऊपर और परे जाने के लिए रास्ता! – Pops

2

C4 आप उस पृष्ठ पर दिखाई यूनिकोड कोड बिंदु, U+00C4 को दर्शाता है। यूटीएफ -8 में ऐसे कोड पॉइंट का प्रतिनिधित्व करने के लिए इस्तेमाल किया गया बाइट अनुक्रम "\xC4" नहीं है। आप जो चाहते हैं वह यूटीएफ -8 (हेक्स।) कॉलम में है, अर्थात् "\xC3\x84"

इसलिए, आपका डेटा यूटीएफ -8 में नहीं है।

आप यूटीएफ -8 here में डेटा एन्कोड किए जाने के तरीके के बारे में पढ़ सकते हैं।

0

मैं टेक्स्ट 7 को मैन्युअल रूप से एक्सएमएल डेटा फ़ाइल बनाने के लिए टेक्स्ट एडिटर के रूप में पाठ संपादक के रूप में चला रहा हूं। मुझे MalformedByteSequenceException मिल रहा था। एक्सएमएल फाइल में मेरा स्पेस यूटीएफ -8 था। चारों ओर घूमने के बाद, मैंने पाया कि मेरे संपादक के पास एक उपकरण था "टूल्स ... डॉस में कनवर्ट करें"। मैंने ऐसा किया, फ़ाइल को फिर से सहेजा, और अपवाद दूर चला गया और मेरा कोड ठीक चला गया।

फिर मैंने अपने संपादक में उस फ़ाइल प्रकार के लिए डिफ़ॉल्ट एन्कोडिंग को देखा। यह ASCII था, हालांकि जब मैंने एएससीआईआईआई में एक्सएमएल एन्कोडिंग पैरामीटर बदल दिया, तो मुझे एक और अलग MalformedByteSequenceException मिला।

तो विंडोज सिस्टम पर, आप एक्सएमएल एन्कोडिंग को यूटीएफ -8 में रखने का प्रयास कर सकते हैं, लेकिन फ़ाइल एन्कोडेड डॉस को सहेज सकते हैं। मैंने यह काम क्यों नहीं किया कि यह क्यों काम करता है।