سؤال

واحدة من مزودينا ترسل أحيانا يغذي XML التي يتم تمييزها عن الوثائق المشفرة UTF-8 بل يشمل الشخصيات التي لم يتم تضمينها في مجموعة الأحرف UTF-8. يؤدي هذا محلل بطرح استثناء ووقف بناء الكائن DOM عندما واجهت هذه الشخصيات:

DocumentBuilder.parse(ByteArrayInputStream bais) 

ويطرح الاستثناء التالي:

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.

هل هناك طريقة ل"التقاط" هذه المشاكل في وقت مبكر وتجنب استثناء (أي إيجاد وإزالة تلك الأحرف من تيار)؟ ما أنا تبحث عن "أفضل جهد" نوع من احتياطي للمستندات المشفرة عن طريق الخطأ. والحل الصحيح يكون من الواضح لمهاجمة المشكلة في المصدر وتأكد من أن يتم تسليم سوى الوثائق الصحيحة، ولكن ما هو نهج جيد عندما لم يكن ذلك ممكنا؟

هل كانت مفيدة؟

المحلول

وإذا كانت المشكلة هي حقا الترميز الخطأ (على العكس من ترميز مختلطة)، لا تحتاج إلى إعادة ترميز المستند إلى تحليل ذلك. مجرد تحليل بأنها القارئ بدلا من InputStream وسوف محلل دوم تجاهل الرأس:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));

نصائح أخرى

ويجب أن تأخذ يدويا نظرة على وثائق غير صحيحة ونرى ما هي المشكلة المشتركة لهم. فمن المحتمل جدا أنها في الواقع في الترميز (على الأرجح النوافذ-1252) آخر، والحل الأفضل ثم سيكون لاتخاذ كل وثيقة من النظام المكسور وإعادة رمز إلى UTF-8 قبل تحليل.

وسبب آخر محتمل هو ترميزات مختلطة (محتوى بعض العناصر في ترميز واحد ومحتوى العناصر الأخرى في ترميز آخر). ومن شأن ذلك أن يكون من الصعب اصلاحها.

وأنت بحاجة أيضا وسيلة لمعرفة متى يحصل الثابتة النظام المكسور حتى تتمكن من التوقف عن استخدام الحل الخاص بك.

ويجب أن نقول لهم أن أبعث إليكم الصحيح UTF-8. إذا تعذر ذلك أي حل يجب إعادة تشفير الأحرف بالسوء UTF-8 صحيح ثم تمريرها إلى محلل. والسبب في ذلك هو أنه إذا كان يتم الاحتفاظ الشخصيات سيئة ثم برامج مختلفة يمكن تفسير أي الطرق المختلفة الإخراج، الذي يمكن أن يؤدي إلى ثغرات أمنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top