[Php] यूटीएफ -8 के माध्यम से सभी तरह से


Answers

मैं चाज़मैटिकस के उत्कृष्ट उत्तर में एक चीज़ जोड़ना चाहता हूं:

मेटा टैग को या तो मत भूलें (इस तरह, या इसका HTML4 या एक्सएचटीएमएल संस्करण ):

<meta charset="utf-8">

यह मामूली लगता है, लेकिन आईई 7 ने मुझे इससे पहले समस्याएं दी हैं।

मैं सब ठीक कर रहा था; डेटाबेस, डेटाबेस कनेक्शन और सामग्री-प्रकार HTTP शीर्षलेख सभी यूटीएफ -8 पर सेट किए गए थे, और यह अन्य सभी ब्राउज़रों में ठीक काम करता था, लेकिन इंटरनेट एक्सप्लोरर ने अभी भी "पश्चिमी यूरोपीय" एन्कोडिंग का उपयोग करने पर जोर दिया।

यह पता चला कि पृष्ठ मेटा टैग गायब था। उस समस्या को हल करना।

संपादित करें:

डब्ल्यू 3 सी वास्तव में I18N को समर्पित एक बड़ा बड़ा अनुभाग है । उनके पास इस मुद्दे से संबंधित कई लेख हैं - HTTP, (एक्स) एचटीएमएल और चीजों के सीएसएस पक्ष का वर्णन:

वे HTTP शीर्षलेख और HTML मेटा टैग (या XML के रूप में एक्सएचटीएमएल के मामले में एक्सएमएल घोषणा दोनों) का उपयोग करने की सलाह देते हैं।

Question

मैं एक नया सर्वर स्थापित कर रहा हूं, और अपने वेब एप्लिकेशन में पूरी तरह से यूटीएफ -8 का समर्थन करना चाहता हूं। मैंने अतीत में मौजूदा सर्वर पर कोशिश की है और हमेशा आईएसओ -885 9 -1 पर वापस आने के लिए खत्म होने लगते हैं।

मुझे एन्कोडिंग / वर्णमाला सेट करने की ज़रूरत है? मुझे पता है कि मुझे ऐसा करने के लिए अपाचे, माईएसQL और PHP को कॉन्फ़िगर करने की आवश्यकता है - क्या वहां कुछ मानक चेकलिस्ट है जो मैं अनुसरण कर सकता हूं, या शायद समस्या निवारण कहां हो सकता है?

यह एक नए लिनक्स सर्वर के लिए है, MySQL 5, PHP 5 और अपाचे 2 चला रहा है।




सबसे पहले यदि आप <5.3PHP में हैं तो नहीं। आपको निपटने के लिए कई समस्याएं हैं।

मुझे आश्चर्य है कि किसी ने intl लाइब्रेरी का उल्लेख नहीं किया है, जिसकी यूनिकोड , ग्रैफेम्स , स्ट्रिंग ऑपरेशंस , स्थानीयकरण और कई अन्य लोगों के लिए अच्छा समर्थन है, नीचे देखें।

मैं PHPBenelux'14 पर एलिजाबेथ स्मिथ की slides द्वारा PHP में यूनिकोड समर्थन के बारे में कुछ जानकारी उद्धृत करूंगा

INTL

अच्छा:

  • आईसीयू पुस्तकालय के आसपास लपेटो
  • मानकीकृत लोकल, प्रति स्क्रिप्ट लोकेल सेट करें
  • संख्या स्वरूपण
  • मुद्रा स्वरूपण
  • संदेश स्वरूपण (गेटटेक्स्ट को प्रतिस्थापित करता है)
  • कैलेंडर, तिथियां, टाइमज़ोन और समय
  • Transliterator
  • Spoofchecker
  • संसाधन बंडल
  • कन्वर्टर्स
  • आईडीएन समर्थन
  • Graphemes
  • मिलान
  • iterators

खराब:

  • Zend_multibite का समर्थन नहीं करता है
  • HTTP इनपुट आउटपुट रूपांतरण का समर्थन नहीं करता है
  • फ़ंक्शन ओवरलोडिंग का समर्थन नहीं करता है

mb_string

  • Zend_multibyte समर्थन सक्षम करता है
  • पारदर्शी HTTP इन / आउट एन्कोडिंग का समर्थन करता है
  • Strtoupper जैसे funtionallity के लिए कुछ रैपर प्रदान करता है

iconv

  • वर्णमाला रूपांतरण के लिए प्राथमिक
  • आउटपुट बफर हैंडलर
  • माइम एन्कोडिंग कार्यक्षमता
  • रूपांतरण
  • कुछ स्ट्रिंग हेल्पर्स (लेन, सबस्ट्र, स्ट्रॉप्स, स्ट्रॉप्स)
  • धारा फ़िल्टर stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP') फ़िल्टर करें stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

डेटाबेस

  • mysql: तालिकाओं और तालिकाओं पर तालमेल और कनेक्शन पर (संयोजन नहीं)। MySQL - msqli या पीडीओ का भी उपयोग न करें
  • postgresql: pg_set_client_encoding
  • sqlite (3): सुनिश्चित करें कि यह यूनिकोड और intl समर्थन के साथ संकलित किया गया था

कुछ अन्य Gotchas

  • आप PHP और विंडोज़ के साथ यूनिकोड फ़ाइल नामों का उपयोग नहीं कर सकते हैं जब तक आप तीसरे भाग का विस्तार नहीं करते।
  • यदि आप exec, proc_open और अन्य कमांड लाइन कॉल का उपयोग कर रहे हैं तो ASCII में सबकुछ भेजें
  • सादा पाठ सादे पाठ नहीं है, फाइलों में एन्कोडिंग है
  • आप आइकन पर फ़िल्टर के साथ फ्लाई पर फ़ाइलों को परिवर्तित कर सकते हैं

अगर चीजें बदलती हैं और इसी तरह की स्थिति में मैं इस जवाब को अपडेट कर दूंगा।




यदि आप MySQL सर्वर को चरित्र सेट का निर्णय लेना चाहते हैं, और क्लाइंट के रूप में PHP नहीं (पुराने व्यवहार; मेरी राय में, पसंदीदा), [mysqld] तहत, your my.cnf skip-character-set-client-handshake जोड़ने का प्रयास करें, और mysql पुनरारंभ करें।

यदि आप यूटीएफ 8 के अलावा कुछ भी उपयोग कर रहे हैं तो इससे परेशानी हो सकती है।




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

आसान हिस्सा सिर्फ HTTP शीर्षलेखों में और डेटाबेस में वर्णमाला निर्दिष्ट कर रहा है, लेकिन यदि कोई भी PHP कोड मान्य यूटीएफ 8 आउटपुट नहीं करता है तो कोई भी महत्वपूर्ण नहीं है। यह कठिन हिस्सा है, और PHP आपको वस्तुतः कोई मदद नहीं देता है। (मुझे लगता है कि PHP6 को इसके सबसे बुरे को ठीक करना है, लेकिन यह अभी भी थोड़ी देर दूर है)




शुरुआत से ही अच्छा लक्ष्य है - आपकी साइट की प्रकृति के आधार पर, मुझे गूगलिंग द्वारा इसके बारे में बहुत सारे संसाधन मिल गए हैं - आप निश्चित रूप से इससे निपटने वाले पहले व्यक्ति नहीं हैं।

रहस्यमय PHP6 यह सब सीधे बाहर होना चाहिए, है ना?

आप सर्वर स्तर पर mysql के लिए वैश्विक डिफ़ॉल्ट वर्णसेट के रूप में utf-8 को बहुत अधिक सेट कर सकते हैं और यह अधिक द्विपक्षीय स्तरों के लिए ठीक से डिफ़ॉल्ट रूप से डिफ़ॉल्ट हो जाएगा।




पुराना विषय, मुझे पता है। पीडीओ का उपयोग कर किसी के साथ कोई समस्या मिली और पीडीओ कनेक्शन स्ट्रिंग के लिए इसका उपयोग करना था:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

जिस साइट से मैंने इसे लिया है, वह इसे Google कैश का उपयोग करके सौभाग्य से प्राप्त करने में सक्षम था।




इन अद्भुत उत्तरों में जो एकमात्र चीज शामिल होगी, वह है कि आप अपनी फाइलों को utf8 एन्कोडिंग में सहेजने पर जोर दें, मैंने देखा है कि ब्राउज़र इस कोड को आपके कोड एन्कोडिंग के रूप में utf8 सेट करने पर स्वीकार करते हैं। कोई भी सभ्य पाठ संपादक आपको यह दिखाएगा, उदाहरण के लिए नोटपैड ++ में फ़ाइल एन्कॉन्डिंग के लिए मेनू विकल्प है, यह आपको वर्तमान एन्कोडिंग दिखाता है और आपको इसे बदलने में सक्षम बनाता है। मेरे सभी PHP फ़ाइलों के लिए मैं बिना बीओएम के utf8 का उपयोग करता हूं।

कुछ समय पहले मैंने किसी से किसी अन्य व्यक्ति द्वारा डिजाइन किए गए php / mysql एप्लिकेशन के लिए utf8 समर्थन जोड़ने के लिए कहा था, मैंने देखा कि सभी फाइलें एएनएसआई में एन्कोड की गई थीं, इसलिए मुझे सभी फ़ाइलों को परिवर्तित करने के लिए आईसीओएनवी का उपयोग करना पड़ा, डेटाबेस टेबल को बदलने के लिए utf8 charset और utf8_general_ci collate, कनेक्शन के बाद डेटाबेस एब्स्ट्रक्शन लेयर में 'सेट नाम utf8' जोड़ें (यदि 5.3.6 या इससे पहले का उपयोग किया जाता है अन्यथा आपको कनेक्शन स्ट्रिंग में charset = utf8 का उपयोग करना होगा) और php multibyte का उपयोग करने के लिए स्ट्रिंग फ़ंक्शंस को बदलें स्ट्रिंग कार्य समकक्ष।




Links