2008-12-18 12 views
14

यह पहचानने का सबसे अच्छा तरीका क्या है कि एक स्ट्रिंग (है या) यूटीएफ -8 एन्कोड किया जा सकता है? Win32 API IsTextUnicode यहां बहुत मदद नहीं है। इसके अलावा, स्ट्रिंग में यूटीएफ -8 बीओएम नहीं होगा, ताकि इसकी जांच नहीं की जा सके। और, हाँ, मुझे पता है कि ASCII रेंज के ऊपर केवल वर्ण 1 बाइट से अधिक एन्कोड किए गए हैं।यूटीएफ -8 एन्कोडेड तारों की पहचान कैसे करें

+1

आपकी कोशिश करने वाली भाषा क्या है? –

+0

वास्तव में कोई फर्क नहीं पड़ता - मैं एक सामान्य विधि की तलाश में हूं। लेकिन अगर आप किसी विशेष भाषा के लिए काम कर सकते हैं, तो कृपया –

+0

में चिल्लाएं और, आपको यूटीएफ -8 स्ट्रीम की शुरुआत में बीओएम नहीं मिलेगा, इसका कोई मतलब नहीं है क्योंकि यूटीएफ -8 वही है जो भी बाइट ऑर्डर है। – mat

उत्तर

17

chardet वर्ण सेट का पता लगाने विकसित मोज़िला फ़ायर्फ़ॉक्स में प्रयोग किया जाता द्वारा सत्यापित करने के लिए एक पर्ल रेगुलर एक्सप्रेशन है। Source code

jchardet मोज़िला के स्वचालित वर्णसेट पहचान एल्गोरिदम से स्रोत का जावा पोर्ट है।

NCharDet मोज़िला और फ़ायरफ़ॉक्स ब्राउज़र में उपयोग किए गए C++ के जावा पोर्ट का .NET (C#) पोर्ट है।

Code project C# नमूना जो कि वर्ण एन्कोडिंग पहचान के लिए माइक्रोसॉफ्ट के MLang का उपयोग करता है।

UTRAC एक कमांड लाइन उपकरण और पुस्तकालय C++ लिखा स्ट्रिंग एन्कोडिंग

cpdetector पता लगाने के लिए

एक और उपयोगी पोस्ट कि पुस्तकालयों का एक बहुत की ओर इशारा करके जान सकते हैं का पता लगाने

एन्कोडिंग के लिए इस्तेमाल एक डेल्फी पुस्तकालय है चरित्र एन्कोडिंग http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

आप संबंधित प्रश्न How Can I Best Guess the Encoding when the BOM (Byte Order Mark) is Missing? पर भी एक प्रश्न देख सकते हैं, इसमें कुछ उपयोगी सामग्री है।

6

कोई वास्तव में विश्वसनीय तरीका नहीं है, लेकिन मूल रूप से, बाइट्स के यादृच्छिक अनुक्रम के रूप में (उदाहरण के लिए मानक 8 बिट एन्कोडिंग में एक स्ट्रिंग) वैध यूटीएफ -8 स्ट्रिंग होने की संभावना नहीं है (यदि सबसे महत्वपूर्ण बिट बाइट सेट है, यूटीएफ -8 में किस तरह के बाइट्स इसका अनुसरण कर सकते हैं, इस बारे में बहुत विशिष्ट नियम हैं), आप स्ट्रिंग को यूटीएफ -8 के रूप में डीकोड करने का प्रयास कर सकते हैं और मान सकते हैं कि यदि कोई डिकोडिंग त्रुटियां नहीं हैं तो यह यूटीएफ -8 है।

यह निर्धारित करना कि क्या डीकोडिंग त्रुटियां हैं, एक और समस्या पूरी तरह से है, कई यूनिकोड लाइब्रेरी केवल एक त्रुटि चिह्न के साथ अमान्य वर्णों को प्रतिस्थापित करते हैं, यह इंगित किए बिना कि कोई त्रुटि हुई है या नहीं। इसलिए आपको यह निर्धारित करने का एक स्पष्ट तरीका चाहिए कि डीकोडिंग के दौरान कोई त्रुटि आई है या नहीं।

5
+0

यदि आप एक स्ट्रीम पढ़ रहे हैं और आपके पास शुरुआत नहीं हो सकती है, तो आपको शुरुआत में \ A को खोना चाहिए या "। {0,5}?" पहले छंटनी वाले चरित्र को पकड़ने के बाद। – mat

+1

मैं भाषा की मानक यूनिकोड लाइब्रेरी का उपयोग करके ऐसा करने की सिफारिश करता हूं बल्कि नियमित अभिव्यक्तियों के माध्यम से इसे पुन: कार्यान्वित करता हूं। – Laurent

1

माणिक में 'chardet' मणि

sudo gem install chardet 

यहाँ मानक इनपुट स्ट्रीम पर chardet को चलाने के लिए एक छोटे से गहरे लाल रंग का स्क्रिप्ट है चरित्र का पता लगाने ऐसा करने के लिए स्थापित करें।

require "rubygems" 
require 'UniversalDetector' #chardet gem 
infile = $stdin.read() 
p UniversalDetector::chardet(infile) 

Chardet इसके सांख्यिकीय विश्लेषण से वर्ण सेट एन्कोडिंग पर कोई अनुमान लगाएं और यह भी एक आत्मविश्वास का स्तर (0-1) आउटपुट

see also this snippet

1

C/C++ स्टैंडअलोन मोज़िला वर्ण सेट डिटेक्टर के आधार पर पुस्तकालय

https://github.com/batterseapower/libcharsetdetect

यूनिवर्सल कैरेक्टर सेट डिटेक्टर (यूसीएसडी) मोज़िला सी ++ यूसीएसडी लाइब्रेरी में सी इंटरफ़ेस और निर्भरता मुक्त इंटरफ़ेस को उजागर करने वाली एक लाइब्रेरी। यह पुस्तकालय हेरिस्टिक्स का एक बेहद सटीक सेट प्रदान करता है जो कुछ इनपुट टेक्स्ट को एन्कोड करने के लिए उपयोग किए गए वर्ण सेट को निर्धारित करने का प्रयास करता है। यह बेहद उपयोगी है जब आपके प्रोग्राम को एक इनपुट फ़ाइल को संभालना होता है जिसे बिना किसी एन्कोडिंग मेटाडेटा के आपूर्ति की जाती है।

0

आप एक भाषा निर्दिष्ट नहीं किया है, लेकिन PHP में आप mb_check_encoding

if(mb_check_encoding($yourDtring, 'UTF-8')) 
    { 
    //the string is UTF-8 
    } 
    else 
    { 
     //string is not UTF-8 
    } 
2

उपयोग कर सकते हैं Windows पर, आप CP_UTF8 कोडपेज और MB_ERR_INVALID_CHARS ध्वज के साथ MultiByteToWideChar() उपयोग कर सकते हैं। यदि फ़ंक्शन विफल रहता है, तो स्ट्रिंग मान्य यूटीएफ -8 मान्य नहीं है।

2

Win32 के लिए, आप mlang एपीआई का उपयोग कर सकते हैं, इस विंडोज का हिस्सा और Windows XP से समर्थित है, इसके बारे में अच्छी बात यह है कि यह आप कैसे संभावना इनपुट एक विशेष एन्कोडिंग में हो रहा है के आंकड़े प्रदान करता है:

CComPtr<IMultiLanguage2> lang; 
HRESULT hr = lang.CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER); 
char* str = "abc"; // EF BB BF 61 62 63 
int size = 6; 
DetectEncodingInfo encodings[100]; 
int encodingsCount = 100; 
hr = lang->DetectInputCodepage(MLDETECTCP_NONE, 0, str, &size, &encodings, &encodingsCount); 
संबंधित मुद्दे