2008-09-22 28 views
51

मैं कुछ डेटा फ़ाइलों को संसाधित कर रहा हूं जिन्हें मान्य यूटीएफ -8 माना जाता है लेकिन ऐसा नहीं है, जो पार्सर (मेरे नियंत्रण में नहीं) को असफल होने का कारण बनता है। मैं यूटीएफ -8 अच्छी तरह से गठबंधन के लिए डेटा को पूर्व-मान्य करने का एक चरण जोड़ना चाहता हूं, लेकिन मुझे अभी तक ऐसा करने में मदद करने के लिए उपयोगिता नहीं मिली है।यह जांचने के लिए कि फ़ाइल वैध यूटीएफ -8 मान्य है या नहीं?

डब्ल्यू 3 सी पर web service है जो मृत प्रतीत होता है, और मुझे विंडोज़-केवल सत्यापन tool मिला है जो अवैध यूटीएफ -8 फाइलों की रिपोर्ट करता है लेकिन रिपोर्ट नहीं करता कि कौन सी रेखाएं/वर्ण ठीक करने के लिए हैं।

मैं किसी भी उपकरण से खुश हूं और उपयोग कर सकता हूं (आदर्श क्रॉस-प्लेटफॉर्म), या रूबी/पर्ल स्क्रिप्ट मैं अपनी डेटा लोडिंग प्रक्रिया का हिस्सा बना सकता हूं।

उत्तर

72

आप जीएनयू iconv का उपयोग कर सकते हैं:

$ iconv -f UTF-8 your_file -o /dev/null 

या इस तरह के MacOS पर के रूप में iconv के पुराने संस्करणों के साथ:

$ iconv -f UTF-8 your_file > /dev/null; echo $? 

आदेश 0 वापस आ जाएगी अगर फ़ाइल सफलतापूर्वक परिवर्तित किया जा सकता है, और 1 अगर नहीं। इसके अतिरिक्त, यह बाइट ऑफसेट प्रिंट करेगा जहां अमान्य बाइट अनुक्रम हुआ था।

संपादित करें: आउटपुट एन्कोडिंग निर्दिष्ट नहीं है, इसे यूटीएफ -8 माना जाएगा।

+13

आइकनव के पुराने संस्करणों में, जैसे ओएसएक्स या फ़िंक में, कोई ध्वज नहीं है। हालांकि, stdout को पुनर्निर्देशित करना हमेशा काम करना चाहिए। –

+1

टोरस्टन, धन्यवाद यह मेरी लिनक्स मशीन पर पूरी तरह से काम करता है। मुझे साइगविन के लिए iconv उपयोगिता का संस्करण नहीं मिला, लेकिन यह एक शोस्टॉपर नहीं है। –

+2

सभी मुद्दों को नहीं पकड़ रहा है ... – zvolkov

10

पायथन और str.encode | डीकोड फ़ंक्शन का उपयोग करें।

>>> a="γεια" 
>>> a 
'\xce\xb3\xce\xb5\xce\xb9\xce\xb1' 
>>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed 
>>> print b.decode("utf_8") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte 

अपवाद फेंकने की जानकारी उसकी .args संपत्ति में अनुरोध की गई है।

>>> try: print b.decode("utf_8") 
... except UnicodeDecodeError, exc: pass 
... 
>>> exc 
UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte') 
>>> exc.args 
('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte') 
3

gnu iconv लाइब्रेरी के बारे में कैसे? Iconv() फ़ंक्शन का उपयोग करना: "इनपुट में एक अमान्य मल्टीबाइट अनुक्रम का सामना करना पड़ता है। इस मामले में यह EILSEQ को इरनो सेट करता है और (size_t) (- 1) देता है। * Inbuf अमान्य मल्टीबाइट अनुक्रम की शुरुआत को इंगित करता है। "

संपादित करें: ओह - मुझे वह हिस्सा याद आया जहां आप एक स्क्रिप्टिंग भाषा चाहते हैं। लेकिन कमांड लाइन काम के लिए, iconv उपयोगिता आपके लिए भी मान्य होना चाहिए।

-3

नीचे दिए गए सी ++ कोड इंटरनेट पर कई साइटों पर पोस्ट किए गए एक पर आधारित है। मैंने मूल कोड में त्रुटि को सही किया और अमान्य चरित्र और अमान्य चरित्र दोनों की स्थिति को पुनर्प्राप्त करने की संभावना को जोड़ा।

///Returns -1 if string is valid. Invalid character is put to ch. 
int getInvalidUtf8SymbolPosition(const unsigned char *input, unsigned char &ch) { 
    int     nb, na; 
    const unsigned char *c = input; 

    for (c = input; *c; c += (nb + 1)) { 
    if (!(*c & 0x80)) 
     nb = 0; 
    else if ((*c & 0xc0) == 0x80) 
    { 
     ch = *c; 
     return (int)c - (int)input; 
    } 
    else if ((*c & 0xe0) == 0xc0) 
     nb = 1; 
    else if ((*c & 0xf0) == 0xe0) 
     nb = 2; 
    else if ((*c & 0xf8) == 0xf0) 
     nb = 3; 
    else if ((*c & 0xfc) == 0xf8) 
     nb = 4; 
    else if ((*c & 0xfe) == 0xfc) 
     nb = 5; 
    na = nb; 
    while (na-- > 0) 
     if ((*(c + nb) & 0xc0) != 0x80) 
     { 
      ch = *(c + nb); 
      return (int)(c + nb) - (int)input; 
     } 
    } 

    return -1; 
} 
+3

इस कोड का पुन: उपयोग न करें, यह गैर-गठित यूटीएफ -8 को स्वीकार करता है जैसे कि गैर-लघु प्रारूप प्रतिनिधित्व, सरोगेट्स और यूनिकोड कोडस्पेस (यू +10 एफएफएफएफ) के ऊपर एन्कोडेड कोडपॉइंट्स। – chansen

+0

चैनसन, वैध यूटीएफ -8 में वर्जित सबसे कम फॉर्म प्रतिनिधित्व और सरोगेट्स हैं? मैंने सोचा कि उनमें वैध यूटीएफ -8 प्रतीकों को इस तरह से शामिल किया गया है, उदाहरण के लिए, एमएसएक्सएमएल 4.0 यूटीएफ -8-एन्कोडेड एक्सएमएल को बिना किसी त्रुटि के ऐसे प्रतीक के साथ लोड करेगा। – izogfif

+0

izogfif, [यूनिकोड मानक संस्करण 6.1] (http://www.unicode.org/versions/Unicode6.1.0/) - [3.9 यूनिकोड एन्कोडिंग फॉर्म] (http://www.unicode.org/versions/Unicode6। 1.0/ch03.pdf) - यूटीएफ -8 डी 2 9: "यूनिकोड मानक से पहले, संस्करण 3.1, यूटीएफ -8 में समस्याग्रस्त" गैर-लघु रूप "बाइट अनुक्रम वे थे जहां बीएमपी पात्रों को एक से अधिक तरीकों से प्रदर्शित किया जा सकता था। ये अनुक्रम बीमार हैं, क्योंकि उन्हें तालिका 3-7 द्वारा अनुमति नहीं है। " "चूंकि सरोगेट कोड पॉइंट यूनिकोड स्केलर वैल्यू नहीं हैं, इसलिए कोई भी यूटीएफ -8 बाइट अनुक्रम जो अन्यथा कोड पॉइंट्स को मैप करेगा। डीएफएफएफ डीडीएफएफ खराब है।" – chansen

4

आप moreutils संग्रह से isutf8 उपयोग कर सकते हैं।

$ apt-get install moreutils 
$ isutf8 your_file 

एक खोल स्क्रिप्ट में, --quiet स्विच का उपयोग करें और बाहर निकलने की स्थिति, जो फ़ाइलों को वैध UTF-8 कर रहे हैं के लिए शून्य है की जाँच करें।

+0

"ब्रू इंस्टॉल ऑटुटल्स"। https://rentes.github.io/unix/utilities/2015/07/27/moreutils-package/ – Oshanz

संबंधित मुद्दे

 संबंधित मुद्दे