2008-10-15 11 views
10

मैं SQL * लोडर का उपयोग कर डेटा लोड करते समय एक पर्ल स्क्रिप्ट का उपयोग करके विकृत स्थान के साथ विकृत स्थान के साथ विकृत यूटीएफ -8 अक्षरों को पहचानना और प्रतिस्थापित करना चाहता हूं। मैं यह कैसे कर सकता हूँ?विकृत यूटीएफ अक्षरों का पता लगाने के लिए

उत्तर

1

संपादित करें: (एसक्यूएल लोडर के बारे में निकाला गया बिट के रूप में यह अब प्रासंगिक लगती है।)

एक समस्या यह है कि क्या एक विकृत UTF-8 वर्ण के "अंत" के रूप में गिना जाता है काम कर बाहर होने जा रहा है। यह कहना आसान है कि क्या अवैध है, लेकिन यह स्पष्ट नहीं हो सकता है कि अगला कानूनी चरित्र कहां से शुरू होता है।

+0

ढूँढना जहां अगले वर्ण शुरू होता है आसान है - कि UTF-8 के डिजाइन के बारे में बहुत शांत चीजों में से एक है। http://tools.ietf.org/html/rfc3629 –

+2

केवल अच्छी तरह से गठित यूटीएफ -8 में आसान है। एक डुप्लिकेट लीड-बाइट डालने की कल्पना करें - आपको पहली घटना को छोड़ना होगा। यदि आप बस यूटीएफ -8 नियमों का पालन करते हैं, तो अगला चरित्र चरित्र के आखिरी बाइट से शुरू होता प्रतीत होता है जिसका नेतृत्व बाइट डुप्लिकेट किया गया था। – MSalters

+0

@MSalters: यही वह चीज है जिसके बारे में मैं सोच रहा था, लेकिन मुझे यकीन नहीं था कि मैं खुद के बारे में सोच रहा हूं :) –

1

RFC 3629 यूटीएफ -8 अक्षरों की संरचना का वर्णन करता है। यदि आप इसे देखते हैं, तो आप देखेंगे कि यह अमान्य वर्ण ढूंढने के लिए बहुत सरल है, और अगली वर्ण सीमा हमेशा ढूंढना आसान है (यह एक वर्ण < 128 है, या "लंबे चरित्र" स्टार्ट मार्करों में से एक है, 110, 1110, या 11110 के प्रमुख बिट्स के साथ)।

लेकिन बीकेबी शायद सही है - सबसे आसान जवाब यह है कि पेर्ल इसे आपके लिए करें, हालांकि मुझे यकीन नहीं है कि जब पर्ल ऐसा करता है तो उस फ़िल्टर के साथ गलत utf-8 का पता लगाता है।

4

पायथन पर विचार करें। यह उपयोगकर्ता द्वारा परिभाषित त्रुटि हैंडलर के साथ कोडेक्स को विस्तारित करने की अनुमति देता है, ताकि आप जो कुछ भी चाहते हैं उसके साथ अपरिवर्तनीय बाइट्स को प्रतिस्थापित कर सकें।

import codecs 
codecs.register_error('spacer', lambda ex: (u' ', ex.start + 1)) 
s = 'spam\xb0\xc0eggs\xd0bacon'.decode('utf8', 'spacer') 
print s.encode('utf8') 

यह प्रिंट:

spam eggs bacon 
संबंधित मुद्दे