PHP

2009-02-03 16 views
19

में फ़ाइल एन्कोडिंग का पता लगाएं मेरे पास एक स्क्रिप्ट है जो कई फाइलों को एक साथ जोड़ती है, और जब फाइलों में से एक में यूटीएफ 8 एन्कोडिंग होती है तो यह टूट जाती है। मुझे लगता है कि फ़ाइलों को पढ़ने के दौरान मुझे utf8_decode() फ़ंक्शन का उपयोग करना चाहिए, लेकिन मुझे नहीं पता कि किसको डिकोडिंग की आवश्यकता है।PHP

मेरे कोड मूल रूप से है:

$output = ''; 
foreach ($files as $filename) { 
    $output .= file_get_contents($filename) . "\n"; 
} 
file_put_contents('combined.txt', $output); 

वर्तमान में, एक UTF8 फ़ाइल के शुरू में, यह कहते हैं उत्पादन में इन पात्रों: 

उत्तर

23

mb_detect_encoding function का उपयोग करने का प्रयास करें। यह फ़ंक्शन आपकी स्ट्रिंग की जांच करेगा और "एन्कोडिंग" का अनुमान लगाने का प्रयास करेगा। फिर आप वांछित के रूप में इसे परिवर्तित कर सकते हैं। brulak suggested के रूप में, आप से से से स्थानांतरित करने वाले डेटा को सुरक्षित रखने के लिए संभवतः को परिवर्तित करने से बेहतर हैं।

+1

मैं हार मानता हूं। मेरे पास * कोई विचार नहीं है * क्यों मेरे लिंक को नष्ट कर रहा है। पूर्वावलोकन में ठीक लग रहा है। : -/ –

+0

हाँ वाह ... wtf वहाँ जा रहा है। लिंक के लिए चीयर्स – nickf

+0

लगता है कि रिश्तेदार लिंक इसे भ्रमित कर रहा है ... अजीब – bobince

1

कैसे आप गैर- ASCII वर्ण को संभालने के लिए जा रहे हैं यूटीएफ -8 या 16 या 32 फाइल से?

मैं पूछता हूं क्योंकि मुझे लगता है कि आपके पास यहां एक डिज़ाइन समस्या हो सकती है।

मैं आपकी आउटपुट फ़ाइल को दूसरी तरफ के बजाय यूटीएफ -8 (या 16 या 32) में परिवर्तित कर दूंगा।

तब आपको यह समस्या नहीं होगी।

क्या आपने सुरक्षा समस्याओं को भी माना है जो एक बच निकले यूटीएफ 8 कोड को परिवर्तित करने से उत्पन्न हो सकते हैं? See this comment:

Detecting multi-byte encoding

चित्रा बाहर क्या अपने स्रोत फ़ाइल एन्कोडिंग में है, तो यह UTF8 में बदल जाएंगे और तुम जाना अच्छा होना चाहिए।

+0

ठीक है, इसलिए मुझे गैर यूटीएफ -8 फ़ाइलों को यूटीएफ -8 में परिवर्तित करना चाहिए ... मैं कैसे बता सकता हूं कि utf_encode() को कॉल की आवश्यकता है? – nickf

+0

आप नहीं करते हैं। आपको पता होना चाहिए कि कौन सी एन्कोडिंग डेटा है - यदि आप नहीं जानते हैं, तो इसे निर्धारित करने का कोई विश्वसनीय तरीका नहीं है। – troelskn

19

सुनिश्चित करें कि उत्पादन इनपुट यह था कि किस तरह की है, मैं का उपयोग UTF-8 है, कोई फर्क नहीं पड़ता बनाने के लिए इस check:

if(!mb_check_encoding($output, 'UTF-8') 
    OR !($output === mb_convert_encoding(mb_convert_encoding($output, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32'))) { 

    $output = mb_convert_encoding($content, 'UTF-8', 'pass'); 
} 

// $output is now safely converted to UTF-8! 
+1

धन्यवाद ... इसने एक फ़ाइल एन्कोडिंग समस्या हल की है, मैं घंटों तक ईंट की दीवार के खिलाफ अपने सिर को झुका रहा था !! – GuruJ

+0

@ गुरुजी ने मुझे यह कार्य सही करने के लिए दिन लगाए। – powtac

+1

दूसरे 'mb_convert_encoding' कॉल में '$ सामग्री' नहीं होना चाहिए,' $ आउटपुट' भी हो सकता है? अन्यथा, '$ सामग्री 'कहां से आ रही है? – Oliver

1

मैं हाल ही में इस मुद्दे को और mb_convert_encoding() समारोह उत्पादन का सामना करना पड़ा UTF- था 8। प्रतिक्रिया हेडर पर एक नज़र लेने के बाद, वहाँ कुछ भी एन्कोडिंग प्रकार का उल्लेख नहीं था, इसलिए मैं Set http header to utf-8 php पाया है, जो निम्नलिखित का प्रस्ताव:

<?php 
header('Content-Type: text/html; charset=utf-8'); 

जोड़ने के बाद कि php फ़ाइल के शीर्ष, सभी के लिए भयानक पात्र चले गए और इसे प्रस्तुत किया जाना चाहिए। निश्चित नहीं है कि मूल पोस्टर जिस मुद्दे की तलाश कर रहा था, लेकिन मुझे यह समस्या हल करने की कोशिश में पाया गया और मुझे लगा कि मैं साझा करूंगा।

//check string strict for encoding out of list of supported encodings 
$enc = mb_detect_encoding($str, mb_list_encodings(), true); 

if ($enc===false){ 
    //could not detect encoding 
} 
else if ($enc!=="UTF-8"){ 
    $str = mb_convert_encoding($str, "UTF-8", $enc); 
} 
else { 
    //UTF-8 detected 
} 
1

यह मेरा समाधान है जो एक आकर्षण की तरह काम किया है। वह WRONG एन्कोडिंग वापस कर सकता है। लिनक्स कमांड file -i /path/myfile.txt बहुत अच्छा काम कर रहा है।पीएचपी में आप इस्तेमाल कर सकते हैं:

function _detectFileEncoding($filepath) { 
    // VALIDATE $filepath !!! 
    $output = array(); 
    exec('file -i ' . $filepath, $output); 
    if (isset($output[0])){ 
     $ex = explode('charset=', $output[0]); 
     return isset($ex[1]) ? $ex[1] : null; 
    } 
    return null; 
} 
8

mb_detect_encoding समारोह अपने अंतिम विकल्प होना चाहिए:

+0

सबसे अच्छा और सुरक्षित समाधान! – Sangar82

1

लिनक्स सर्वर के लिए, मैं इस आदेश का उपयोग करें:

$file = 'your/file.ext' 
exec("from=`file -bi $file | awk -F'=' '{print $2 }'` && iconv -f \$from -t utf-8 $file -o $file"); 
0

स्कैन सभी फाइल .. mb_list_encodings, अच्छे प्रदर्शन से एन्कोडिंग के किसी भी प्रकार पाता है,

function detectFileEncoding($filePath){ 

    $fopen=fopen($filePath,'r'); 

    $row = fgets($fopen); 
    $encodings = mb_list_encodings(); 
    $encoding = mb_detect_encoding($row, "UTF-8, ASCII, Windows-1252, Windows-1254");//these are my favorite encodings 

    if($encoding !== false) { 
     $key = array_search($encoding, $encodings) !== false; 
     if ($key !== false) 
      unset($encodings[$key]); 
     $encodings = array_values($encodings); 
    } 

    $encKey = 0; 
    while ($row = fgets($fopen)) { 
     if($encoding == false){ 
      $encoding = $encodings[$encKey++]; 
     } 

     if(!mb_check_encoding($row, $encoding)){ 
      $encoding =false; 
      rewind($fopen); 
     } 

    } 

    return $encoding; 
} 
संबंधित मुद्दे