2016-03-11 15 views
6

मेरे पास उनके नाम पर वर्ण वाली फ़ाइलें हैं।कैरेक्टर गलत तरीके से एन्कोड किया गया

इन फ़ाइलों को अच्छी तरह से लिनक्स (अपाचे/php) के तहत नियंत्रित किया जाता है:

$files = scandir($path); 
echo json_encode($files); 

file1⌐
file2⌐
file3⌐
file4⌐

विंडोज के तहत वे लगते हैं फ़ाइल सिस्टम द्वारा विंडोज -1252 के रूप में पढ़ने के लिए, इसलिए मुझे conditi करना पड़ा onally उन्हें इतना है कि json_encode

$files = scandir($path); 
foreach ($files as $i => $file) { 
    $files[$i] = mb_convert_encoding($file, 'UTF-8', 'Windows-1252'); 
} 
echo json_encode($files); 

यहाँ काम कर सकता था परिवर्तित किया जाता है कि वे किस तरह परिवर्तित

file1¬
file2¬
file3¬
file4¬

हो क्यों है ¬ में परिवर्तित हो रहा है और मैं ओरी कैसे प्राप्त कर सकता हूं जीन चरित्र?

+0

थोड़ा अस्पष्ट जो आप चाहते हैं, लेकिन मुझे क्या पता है कि लिनक्स बैकस्लैश का उपयोग करता है और विंडोज डिफ़ॉल्ट रूप से आगे का उपयोग करता है (लेकिन बैकस्लाश का भी समर्थन करता है)। इसका उपयोग करने का प्रयास करें। –

+1

अजीब बात यह है कि विंडोज -1252 में "रिवर्स साइन साइन" के लिए एक वर्ण एन्कोडिंग भी नहीं है, लेकिन इसमें "साइन इन" के लिए कोई नहीं है। हो सकता है कि आपको विंडोज -1252 में स्ट्रिंग वापस नहीं मिल रहा है जैसा आपने सोचा था? क्या आपने अभी सुनिश्चित करने के लिए mb_detect_encoding() करने का प्रयास किया है? –

+0

मैं 'mb_check_encoding' का उपयोग कर रहा हूं जो मुझे _Windows-1252_ मान्य करता है। मैंने 'mb_detect_encoding' भी कोशिश की (मुझे बता रहा है कि यह _UTF-8_ नहीं है)। _Windows-1252_ की अनुपस्थिति "रिवर्स साइन साइन" के लिए अच्छा बिंदु –

उत्तर

1

कृपया अपने फ़ाइल नामों के महत्वपूर्ण चरित्र un पर अनपैक ('सी *', $ चार) आज़माएं। फिर आप देखेंगे कि यह पहले से ही 0xAC है (जो ¬ है)।

इसका कारण यह है कि स्कैंडर() विंडोज के 8-बिट एएनएसआई एपीआई का उपयोग करता है जो एक प्रतिस्थापन करता है और विंडोज -1252 पर मौजूद वर्णों के लिए कुछ "निकटतम मिलान करने वाला चरित्र" प्रदान करता है। यदि आप टेक्स्ट-एडिटर नोटपैड ++ प्राप्त करते हैं, तो आप वही व्यवहार देख सकते हैं, इसे एएनएसआई पर सेट करें और & कॉपी करने का प्रयास करें, इसे अपने ⌐ में पेस्ट करें। यह ¬ के रूप में दिखाई देगा (और मजेदार रूप से यह सी & पी बफर में भी बदल गया जब मैंने इसे अपने सिस्टम पर करने की कोशिश की)।

आप क्या कर सकते हैं?

  1. उपयोग shell_exec विंडोज पर ('dir/b') (मैं इस परीक्षण किया है, आप मूल चरित्र मिलता है)
  2. मान लें कि विंडोज पर फ़ाइल नामों के लिए ⌐ साधन ¬ और बस की जगह: ठीक है यहाँ कुछ विकल्प हैं यूटीएफ -8 रूपांतरण
  3. अपने सॉफ़्टवेयर सिस्टम को बदलें ताकि चरित्र ⌐ अब फ़ाइल नामों में उपयोग नहीं किया जा सके
  4. कुछ प्रयोगात्मक PHP निर्माण का उपयोग करें जिसमें फ़ंक्शन stream_encoding है और नीचे दिए गए कोड को आज़माएं। (एनबी: stream_encoding, अपरिभाषित है भी भरी हुई mbstring, निम्नलिखित आधिकारिक में साथ बनाता है: 5.6.19 7.0.4)
$myContext = stream_context_create(); 
stream_encoding($myContext, 'UTF-8'); 
$files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext); 

जबकि shell_exec आम तौर पर बचा जाना चाहिए, मुझे लगता है कि यह अभी के लिए अपने सबसे अच्छा विकल्प है । यदि आप कर सकते हैं तो लंबी अवधि में आपको 3 के लिए जाना चाहिए। मैं 4 की सिफारिश नहीं करता। (मैंने यह भी परीक्षण नहीं किया है) और मुझे आपके परिदृश्य के बारे में पर्याप्त जानकारी नहीं है कि यह बताएं कि क्या 2. व्यवहार्य है।

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