2012-03-19 21 views
11

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि विकल्प के साथ iconv() पर कॉल के परिणामस्वरूप पर्यावरण या अन्य कारकों का क्या प्रभाव पड़ता है।कौन से कारक सफल iconv() ट्रान्सलिट रूपांतरण को प्रभावित करते हैं?

अपाचे और सीएलआई के माध्यम से चलाए जाने पर निम्न कोड के स्थानीय स्तर पर मेरे लिए अलग-अलग परिणाम हैं।

<?php 
    setlocale(LC_ALL, 'en_GB.UTF-8'); 
    header('Content-type: text/html; charset=utf-8'); // for web  

    $utf8_string = "Pádraig's naïve café"; 

    echo iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $utf8_string); 
?> 

अपेक्षित परिणाम: (empty string)

CLI से परिणाम:: Padraig's naive cafe

एक वेब ब्राउज़र में परिणाम P'adraig's na"ive cafe

कुछ सिस्टम पर, मैं उम्मीद परिणाम प्राप्त करते हैं, लेकिन मैं कर सकते हैं ' ठीक क्यों टाई।

रूपांतरण किस कारक को प्रभावित करते हैं, और अच्छे नतीजे के अवसर को बढ़ाने के लिए मुझे किन कदमों का पालन करना चाहिए?

+0

आपकी स्रोत फ़ाइल को utf-8 फ़ाइल के रूप में सहेजा जाना चाहिए। अन्यथा आपकी स्ट्रिंग वास्तव में utf-8 नहीं होगी, भले ही आप आइकनव कह रहे हों। – ontrack

+0

फ़ाइल यूटीएफ -8 के रूप में सहेजी गई है। – drewm

+0

आपको सही परिणाम क्या सिस्टम मिलते हैं? क्या यह एक लिनक्स/विंडोज सर्वर है तो यह बदलता है? – James

उत्तर

4

लोकेल iconv लिप्यंतरण को प्रभावित करता है। हालांकि, आपको setlocale­Docs मैनुअल पेज पर चेतावनी पढ़नी चाहिए:

लोकल जानकारी प्रति प्रक्रिया के अनुसार प्रति प्रक्रिया बनाए रखी जाती है। यदि आप विंडोज़ पर आईआईएस या अपाचे जैसे मल्टीथ्रेडेड सर्वर एपीआई पर PHP चला रहे हैं, तो आपको स्क्रिप्ट चलने के दौरान लोकेल सेटिंग्स में अचानक बदलाव का अनुभव हो सकता है, हालांकि स्क्रिप्ट को कभी भी setlocale() नहीं कहा जाता है। यह एक ही समय में एक ही प्रक्रिया के विभिन्न धागे में चल रही अन्य स्क्रिप्ट के कारण होता है, setlocale() का उपयोग कर प्रक्रिया-व्यापी लोकेल को बदलना।

तो आप लोकेल सेट कर सकते हैं लेकिन यह कहीं और बदल गया है। जब तक लोकेल बिल्कुल वही है, वही परिणाम आपको मिलेंगे।

आपको यहां आइकॉन के प्रलेखन और स्रोत-कोड मिलते हैं: http://www.gnu.org/software/libiconv/ - यह आमतौर पर PHP द्वारा उपयोग की जाने वाली लाइब्रेरी है।

+0

जैसा कि आप कोड उदाहरण से देख सकते हैं, लोकेल समान है, फिर भी परिणाम अलग हैं। – drewm

+0

आप यह नहीं कह सकते कि लोकेल समान है, क्योंकि इस समय इसका उपयोग किया जाता है, यह अलग हो सकता है। और आपके पास इसे सत्यापित करने का कोई तरीका नहीं है। हालांकि, यदि आप libiconv के स्रोत-कोड में एक नज़र डालते हैं तो आप देखेंगे कि यह लोकेल पर आधारित है। – hakre

0

setlocale झूठ बोल रहा है? आप कौन सा ओएस चला रहे हैं?

आप बॉक्स पर locale -a चलाने का प्रयास कर सकते हैं यह देखने के लिए कि कौन से स्थान स्थापित हैं, setlocale आपके द्वारा निर्दिष्ट लोकेल को वापस करना चाहिए।

के साथ en_GB.UTF-8 के साथ केंद्रों पर ऊपर अपना उदाहरण चलाना अपेक्षित परिणाम देता है।

+0

'सेटलोकेल' रिटर्न 'en_GB.UTF-8'। यह मैक ओएस एक्स 10.7.3 पर है। – drewm