2010-12-10 7 views
17

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

गलती से एक ही सामान दो बार लागू किया जाता है/या गलत विधि मैं कुछ अधिक बदसूरत मिल प्रयोग किया जाता है, तो यह है कि मैं क्या बदलना चाहते है।

स्ट्रिंग पर क्या लागू करना है, मैं कैसे पता लगा सकता हूं?

अद्यतन

वास्तव में सामग्री को UTF-8 देता है, लेकिन अंदर वहाँ भागों है कि नहीं कर रहे हैं।

+0

हम यह मान चाहिए कि फ़ीड कुछ चारसेट वाणी लेकिन एक और एक का उपयोग करता है? –

+0

हां, यही कारण है। – Pentium10

+0

एक उदाहरण फ़ीड प्रदान करें कृपया – Gordon

उत्तर

50

मैं नहीं कह सकता कि मैं mb_detect_encoding() पर भरोसा कर सकता हूं। कुछ समय पहले कुछ अजीब झूठी सकारात्मक बातें थीं।

सबसे सार्वभौमिक तरह से मैं हर मामले में अच्छी तरह से काम करने के लिए मिला था:

if (preg_match('!!u', $string)) 
{ 
    // this is utf-8 
} 
else 
{ 
    // definitely not utf-8 
} 
+2

+1 utf8_validate() कार्यान्वित अपने समाधान का उपयोग करता है अगर यह नहीं है UTF8 के लिए एक स्ट्रिंग परिवर्तित करने के लिए, एक आकर्षण के रूप में काम करता है! –

+4

धन्यवाद! यही कारण है कि एक बहुत ही चतुर चाल ;-) जब से मैं बिल्कुल नहीं 'friggin सुराग कि यह कैसे काम करता था, मैं पीएचपी प्रलेखन में delved खोजने के लिए [इस] (http://us2.php.net/manual/en/reference.pcre। pattern.modifiers.php): 'u (पीसीआर 8) यह संशोधक पीसीआरई की अतिरिक्त कार्यक्षमता को चालू करता है जो पर्ल के साथ असंगत है। पैटर्न तारों को यूटीएफ -8 के रूप में माना जाता है। यह संशोधक यूनिक्स पर PHP 4.1.0 या उससे अधिक और Win32 पर PHP 4.2.3 से अधिक है। PHP 4.3.5 के बाद से पैटर्न की यूटीएफ -8 वैधता की जांच की जाती है। ' वैसे भी, एक गुच्छा धन्यवाद! – Edward

+2

कि regexp में डॉट की भी आवश्यकता नहीं है 'preg_match (' !! u ', $ str)' ठीक काम करता है – rsk82

0

फ़ीड (मुझे लगता है कि आप किसी प्रकार का एक्सएमएल आधारित फ़ीड) का मतलब है हेडर में एक विशेषता होना चाहिए जो आपको बता रहा है कि एन्कोडिंग क्या है। यदि नहीं, तो आप भाग्य से बाहर हैं क्योंकि आपके पास एन्कोडिंग की पहचान करने का विश्वसनीय माध्यम नहीं है।

3

आप

  • mb_detect_encoding उपयोग कर सकते हैं - वर्ण एन्कोडिंग

का पता लगाने चारसेट भी HTTP Response Headers में या प्रतिक्रिया डेटा अपने आप में उपलब्ध हो सकता है।

उदाहरण:

var_dump(
    mb_detect_encoding(
     file_get_contents('http://stackoverflow.com/questions/4407854') 
    ), 
    $http_response_header 
); 

आउटपुट (codepad):

string(5) "UTF-8" 
array(9) { 
    [0]=> 
    string(15) "HTTP/1.1 200 OK" 
    [1]=> 
    string(33) "Cache-Control: public, max-age=11" 
    [2]=> 
    string(38) "Content-Type: text/html; charset=utf-8" 
    [3]=> 
    string(38) "Expires: Fri, 10 Dec 2010 10:40:07 GMT" 
    [4]=> 
    string(44) "Last-Modified: Fri, 10 Dec 2010 10:39:07 GMT" 
    [5]=> 
    string(7) "Vary: *" 
    [6]=> 
    string(35) "Date: Fri, 10 Dec 2010 10:39:55 GMT" 
    [7]=> 
    string(17) "Connection: close" 
    [8]=> 
    string(21) "Content-Length: 34119" 
} 
0

एन्कोडिंग autotection बुलेट प्रूफ नहीं है, लेकिन आप mb_detect_encoding() कोशिश कर सकते हैं। mb_check_encoding() भी देखें।

3
function str_to_utf8 ($str) { 
    $decoded = utf8_decode($str); 
    if (mb_detect_encoding($decoded , 'UTF-8', true) === false) 
     return $str; 
    return $decoded; 
} 

var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); 
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) 
var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); 
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) 

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

  • कोई संबंधित समस्या नहीं^_^