मेरा पर्ल प्रोग्राम डिस्क फ़ाइल से कुछ पाठ इनपुट के रूप में लेता है, इसे कुछ एक्सएमएल में लपेटता है, फिर इसे STDOUT तक आउटपुट करता है। इनपुट नाममात्र यूटीएफ -8 है, लेकिन कभी-कभी जंक डाला जाता है। मुझे आउटपुट को स्वच्छ करने की आवश्यकता है कि कोई अमान्य यूटीएफ -8 ऑक्टेट उत्सर्जित नहीं होता है, अन्यथा डाउनस्ट्रीम उपभोक्ता (स्फिंक्स) उड़ाएगा।मैं पर्ल में अवैध यूटीएफ -8 को कैसे स्वच्छ कर सकता हूं?
कम से कम यदि डेटा अमान्य है तो मैं इसे पास करने से बच सकता हूं; आदर्श रूप से मैं केवल अपमानजनक बाइट हटा सकता हूं। हालांकि, मुझे लगता है कि सभी घातक मुझे सक्षम बनाता है मुझे वहाँ 5.1l (FWIW, use v5.12; use warnings qw(FATAL utf8);
प्रभाव में है) के साथ काफी नहीं मिलता है।
मुझे विशेष रूप से अनुक्रम "\xFE\xBF\xBE"
के साथ समस्या हो रही है। अगर मैं केवल इन तीन बाइट्स (perl -e 'print "\xEF\xBF\xBE"' > bad.txt
) वाली फ़ाइल बनाते हैं, तो :encoding(UTF-8)
त्रुटियों के साथ फ़ाइल को पढ़ने की कोशिश कर रहा है utf8 "\xFFFE" does not map to Unicode
, लेकिन केवल 5.14.0 के तहत। 5.12.3 और इससे पहले पूरी तरह से ठीक पढ़ रहे हैं और बाद में अनुक्रम लिख रहे हैं। मुझे यकीन है कि यह \xFFFE
(अवैध रिवर्स-बीओएम) प्राप्त कर रहा है, लेकिन कम से कम शिकायत स्पिंक्स के साथ संगत है।
दुर्भाग्यवश, decode_utf8("\xEF\xBF\xBE", 1)
5.12 या 5.14 के तहत कोई त्रुटि नहीं बनता है। मैं एक पहचान विधि पसंद करूंगा जिसके लिए एन्कोडेड I/O परत की आवश्यकता नहीं है, क्योंकि यह मुझे एक त्रुटि संदेश के साथ छोड़ देगा और कच्चे ऑक्टेट को स्वच्छ करने का कोई तरीका नहीं है।
मुझे यकीन है कि ऐसे अधिक अनुक्रम हैं जिन्हें मुझे संबोधित करने की आवश्यकता है, लेकिन बस इसे संभालना एक शुरुआत होगी। तो मेरे प्रश्न हैं: क्या मैं विश्वसनीय रूप से इस प्रकार के समस्या डेटा को 5.14 से पहले एक पर्ल के साथ पहचान सकता हूं? प्रतिस्थापन दिनचर्या आमतौर पर सख्त यूटीएफ -8 में लगभग-यूटीएफ -8 को स्वच्छ कर सकती है?
कोड उदाहरण: http: // stackoverflow।कॉम/प्रश्न/3735721/चेकलिस्ट-टू-द-यूनिकोड-वे-साथ-पर्ल/3736787 # 3736787 – daxim
धन्यवाद, यह बहुत उपयोगी है। चूंकि XML में स्वीकार्य यूनिकोड वर्ण अच्छी तरह परिभाषित हैं, 'tr [\ x {9} \ x {ए} \ x {D} \ x {20} - \ x {D7FF} \ x {E000} - \ x {FFFD} \ x {10000} - \ x {10FFFF}] [] सीडी' ऐसा लगता है कि यह कम से कम 5.14 में काम करेगा। मुझे मिला एक पूरी तरह से अलग सुझाव बिल्कुल एक नए पेर्ल पर भरोसा नहीं करता है: 'iconv -c - यूटीएफ -8 से - यूटीएफ -8' तक। –