UTF-8 के माध्यम से सभी तरह से


1191

मैं एक नया सर्वर स्थापित कर रहा हूं और अपने वेब एप्लिकेशन में UTF-8 का पूरी तरह से समर्थन करना चाहता हूं। मैंने मौजूदा सर्वरों पर अतीत में यह कोशिश की है और हमेशा ISO-8859-1 पर वापस गिरने के लिए लगता है।

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

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


8
यहां सभी एन्कोडिंग दोषों के बारे में एक सिंहावलोकन है जो आप संभवतः बना सकते हैं: sebastianviereck.de/en/…
सेबस्टियन वियरेक


PHP 7 के बारे में कुछ हालिया चर्चाएं बताती हैं कि 2010 की "आधिकारिक तौर पर छोड़ी गई" स्थिति में कोई बदलाव नहीं हैं ... "PHP7 और UTF-8" के बारे में कुछ और भी हैं?
पीटर क्रस

यह समस्या आम है। लेकिन कोई शॉर्टकट समाधान नहीं है, आपको utf-8उनमें से प्रत्येक के लिए सेटअप करना होगा - MySQL 5, PHP 5 या Apache 2.
मनीष श्रीवास्तव

जवाबों:


1015

डेटा संग्रहण :

  • utf8mb4अपने डेटाबेस में सभी तालिकाओं और पाठ स्तंभों पर सेट वर्ण निर्दिष्ट करें । यह MySQL को भौतिक रूप से संग्रहीत करता है और UTF-8 में मूल रूप से एन्कोड किए गए मानों को पुनः प्राप्त करता है। ध्यान दें कि utf8mb4यदि कोई utf8mb4_*टकराव निर्दिष्ट किया गया है (बिना किसी स्पष्ट वर्ण सेट के) MySQL अंतर्निहित रूप से एन्कोडिंग का उपयोग करेगा ।

  • MySQL के पुराने संस्करणों में (<5.5.3), आपको दुर्भाग्य से बस उपयोग करने के लिए मजबूर किया जाएगा utf8, जो केवल यूनिकोड वर्णों के सबसेट का समर्थन करता है। काश मैं मजाक कर रहा होता।

डेटा एक्सेस :

  • आपके एप्लिकेशन कोड (जैसे PHP) में, आप जो भी डीबी एक्सेस विधि का उपयोग करते हैं, उसमें आपको कनेक्शन चारसेट करने की आवश्यकता होगी utf8mb4। इस तरह, MySQL अपने मूल UTF-8 से कोई रूपांतरण नहीं करता है जब यह आपके एप्लिकेशन और इसके विपरीत डेटा बंद कर देता है।

  • कुछ ड्राइवर कनेक्शन वर्ण सेट को कॉन्फ़िगर करने के लिए अपना स्वयं का तंत्र प्रदान करते हैं, जो दोनों अपनी आंतरिक स्थिति को अपडेट करते हैं और कनेक्शन पर उपयोग किए जाने वाले एन्कोडिंग के MySQL को सूचित करते हैं - यह आमतौर पर पसंदीदा दृष्टिकोण है। PHP में:

    • यदि आप PHP, 5.3.6 के साथ PDO अमूर्त परत का उपयोग कर रहे हैं , तो आप DSNcharset में निर्दिष्ट कर सकते हैं :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • यदि आप mysqli का उपयोग कर रहे हैं , तो आप कॉल कर सकते हैं set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • यदि आप सादे mysql के साथ फंस गए हैं, लेकिन PHP, 5.2.3 चल रहा है, तो आप कॉल कर सकते हैंmysql_set_charset

  • यदि ड्राइवर कनेक्शन वर्ण सेट करने के लिए अपना स्वयं का तंत्र प्रदान नहीं करता है, तो आपको MySQL को बताने के लिए एक क्वेरी जारी करनी पड़ सकती है कि आपका आवेदन कनेक्शन के डेटा को एन्कोडेड करने की अपेक्षा करता है: SET NAMES 'utf8mb4' :।

  • के संबंध में समान विचार utf8mb4/utf8उपरोक्त के लागू होता है।

उत्पादन :

  • यदि आपका एप्लिकेशन अन्य सिस्टम पर पाठ प्रसारित करता है, तो उन्हें वर्ण एन्कोडिंग के बारे में भी सूचित करना होगा। वेब अनुप्रयोगों के साथ, ब्राउज़र को एन्कोडिंग के बारे में सूचित किया जाना चाहिए जिसमें डेटा भेजा जाता है (HTTP प्रतिक्रिया हेडर के माध्यम से या HTML मेटाडेटा के )।

  • PHP में, आप उपयोग कर सकते हैं default_charset php.ini विकल्प का , या मैन्युअल रूप से Content-TypeMIME हैडर को स्वयं जारी , जो अभी और अधिक काम करता है लेकिन समान प्रभाव है।

  • आउटपुट का उपयोग करते समय एन्कोडिंग करें json_encode(), जोड़ेंJSON_UNESCAPED_UNICODE दूसरे पैरामीटर के रूप में ।

इनपुट :

  • दुर्भाग्य से, आपको इसे प्राप्त करने या कहीं भी उपयोग करने का प्रयास करने से पहले हर प्राप्त स्ट्रिंग को वैध UTF-8 के रूप में सत्यापित करना चाहिए। PHP की mb_check_encoding()चाल है, लेकिन आपको इसे धार्मिक रूप से उपयोग करना होगा। इसके आस-पास वास्तव में कोई रास्ता नहीं है, क्योंकि दुर्भावनापूर्ण ग्राहक जो भी एन्कोडिंग चाहते हैं उसमें डेटा जमा कर सकते हैं, और मुझे PHP को मज़बूती से ऐसा करने के लिए एक चाल नहीं मिली है।

  • वर्तमान HTML युक्ति के मेरे पढ़ने से , निम्नलिखित उप-बुलेट आधुनिक HTML के लिए आवश्यक या मान्य नहीं हैं। मेरी समझ यह है कि ब्राउज़र दस्तावेज़ के लिए निर्दिष्ट वर्ण सेट में डेटा के साथ काम करेंगे और सबमिट करेंगे। हालाँकि, यदि आप HTML (XHTML, HTML4, आदि) के पुराने संस्करणों को लक्षित कर रहे हैं, तो ये बिंदु अभी भी उपयोगी हो सकते हैं:

    • HTML5 से पहले HTML के लिए : आप चाहते हैं कि आपके द्वारा भेजे गए सभी डेटा UTF-8 में हों। दुर्भाग्य से, यदि आप एकमात्र तरीका से मज़बूती से करते हैं तो यह accept-charsetआपके सभी के लिए विशेषता है<form> टैगों<form ... accept-charset="UTF-8"> :।
    • HTML5 के लिए केवल HTML से पहले : ध्यान दें कि W3C HTML कल्पना कहती है कि क्लाइंट को "सर्वर को जो भी सर्वर को सेवा प्रदान करने में वापस भेजने के लिए" डिफ़ॉल्ट होना चाहिए, लेकिन यह स्पष्ट रूप से केवल एक सिफारिश है, इसलिए हर एक पर स्पष्ट होने की आवश्यकता है <form>टैग।

अन्य कोड विचार :

  • स्पष्ट रूप से पर्याप्त है, आप (PHP, HTML, जावास्क्रिप्ट, आदि) की सेवा कर रहे सभी फ़ाइलों को मान्य UTF-8 में एन्कोड किया जाना चाहिए।

  • आपको यह सुनिश्चित करने की आवश्यकता है कि हर बार जब आप UTF-8 स्ट्रिंग संसाधित करते हैं, तो आप ऐसा सुरक्षित रूप से करते हैं। यह, दुर्भाग्य से, कठिन हिस्सा है। आप शायद PHP के व्यापक उपयोग करना चाहते हैंmbstring विस्तार ।

  • PHP के स्ट्रिंग आपरेशन में निर्मित कर रहे हैं नहीं डिफ़ॉल्ट UTF-8 सुरक्षित द्वारा। कुछ चीजें हैं जो आप सामान्य पीएचपी स्ट्रिंग ऑपरेशन (जैसे कॉन्सेप्टन) के साथ सुरक्षित रूप से कर सकते हैं, लेकिन ज्यादातर चीजों के लिए आपको समकक्ष mbstringफ़ंक्शन का उपयोग करना चाहिए ।

  • यह जानने के लिए कि आप क्या कर रहे हैं (पढ़ें: इसे गड़बड़ न करें), आपको वास्तव में UTF-8 और यह जानने की आवश्यकता है कि यह सबसे कम संभव स्तर पर कैसे काम करता है। कुछ अच्छे संसाधनों के लिए utf8.com के किसी भी लिंक को देखें , जो आपको जानना है।


4
यह मेरी समझ है कि यदि आप टकराव को utf8_ * के रूप में निर्दिष्ट करते हैं, तो यह स्वचालित रूप से utf8 के रूप में भी एन्कोड करता है। क्या यह गलत है?
chazomaticus

49
मैं गलत नहीं हूँ: COLLATE का अर्थ है CHARACTER SET। उदा । Dev.mysql.com/doc/refman/5.0/en/charset-database.html देखें ।
chazomaticus

7
चरित्र सेट करने के लिए पीडीओ उदाहरण जोड़ने पर भी विचार करें।
जाक

97
ध्यान दें कि MySQL अन्य सभी के समान भाषा नहीं बोलता है। जब MySQL "utf8" कहता है, तो इसका वास्तव में अर्थ है "UTF-8 के कुछ अजीब मंद संस्करण जो भगवान के लिए तीन बाइट्स तक सीमित हैं, जानते हैं कि क्या हास्यास्पद कारण है"। यदि आप वास्तव में UTF-8 चाहते हैं तो आपको MySQL को बताना चाहिए कि आप इस अजीब चीज़ को चाहते हैं MySQL utf8mb4 पर कॉल करना पसंद करता है । "WTF!" S को बचाने में परेशान न करें।
आर। मार्टिनो फर्नांडीस

4
इस उत्तर ने मुझे इतना मदद की लेकिन मैंने यह भी पाया कि मेरे मामले में मुझे अपने PHP json_encode में JSON_UNESCAPED_UNICODE जोड़ने की जरूरत है जब DB क्वेरी परिणाम ajax के माध्यम से वापस आते हैं।
पेटाय87

150

मैं chazomaticus के उत्कृष्ट उत्तर में एक बात जोड़ना चाहूंगा :

मेटा टैग को न भूलें (जैसे यह, या HTML4 या XHTML संस्करण ):

<meta charset="utf-8">

यह तुच्छ लगता है, लेकिन IE7 ने मुझे इससे पहले समस्या दी है।

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

यह पता चला कि पेज मेटा टैग गायब था। जो जोड़ने से समस्या हल हो गई।

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

W3C में वास्तव में I18N को समर्पित एक बड़ा खंड है । उनके पास इस मुद्दे से संबंधित कई लेख हैं - HTTP, (X) HTML और सीएसएस चीजों का वर्णन:

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


HTTP हेडर में चारसेट को निर्दिष्ट करना भी संभव नहीं है? शायद वेबसर्वर के लिए कुछ कॉन्फिग विकल्प की जरूरत है ...
ओलिव

2
@oliver: हाँ आप इसे HTTP हेडर में भेज सकते हैं, लेकिन इसे कंटेंट में भेजना बेहतर है क्योंकि अगर क्लाइंट फाइल को सेव करता है, तो यह हमेशा मेटा टैग को सेव करेगा। एक HTTP हेडर सिर्फ गायब होने की संभावना है जब तक कि ब्राउज़र सहेजे गए फ़ाइल में मेटा टैग में कॉपी करने के लिए पर्याप्त स्मार्ट न हो।

5
इसके अलावा, सुनिश्चित करें कि लाइन मुख्य तत्व का पहला बच्चा है (किसी भी यूनिकोड सामान से पहले)। ऊपर वर्णित मेटा तत्व को मारने के बाद ब्राउज़र पृष्ठ को फिर से व्याख्या कर सकता है।
एलेक्स

64

default_charsetPhp.ini में सेटिंग के अलावा , आप header()किसी भी आउटपुट से पहले अपने कोड के भीतर से सही चारसेट का उपयोग कर भेज सकते हैं :

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

PHP में यूनिकोड के साथ काम करना तब तक आसान है जब तक आपको एहसास होता है कि अधिकांश स्ट्रिंग फ़ंक्शंस यूनिकोड के साथ काम नहीं करते हैं, और कुछ पूरी तरह से तार को जोड़ सकते हैं । PHP "अक्षर" को 1 बाइट लंबा मानता है। कभी-कभी यह ठीक है (उदाहरण के लिए, explode()केवल एक बाइट अनुक्रम के लिए दिखता है और इसे एक विभाजक के रूप में उपयोग करता है - इसलिए यह कोई फर्क नहीं पड़ता कि आप किस वास्तविक वर्ण के लिए दिखते हैं)। लेकिन अन्य बार, जब फ़ंक्शन वास्तव में वर्णों पर काम करने के लिए डिज़ाइन किया गया है , तो PHP को पता नहीं है कि आपके पाठ में मल्टी-बाइट वर्ण हैं जो यूनिकोड के साथ पाए जाते हैं।

जाँच करने के लिए एक अच्छा पुस्तकालय phputf8 है । यह सभी "खराब" कार्यों को फिर से लिखता है ताकि आप सुरक्षित रूप से UTF8 स्ट्रिंग्स पर काम कर सकें। Mbstring एक्सटेंशन जैसे एक्सटेंशन हैं जो आपके लिए भी ऐसा करने की कोशिश करते हैं, लेकिन मैं लाइब्रेरी का उपयोग करना पसंद करता हूं क्योंकि यह अधिक पोर्टेबल है (लेकिन मैं मास-मार्केट उत्पाद लिखता हूं, इसलिए यह मेरे लिए महत्वपूर्ण है)। लेकिन phputf8 प्रदर्शन को बढ़ाने के लिए, पर्दे के पीछे mbstring का उपयोग कर सकता है।


अधिभार सेटिंग को php.ini में सेट करें। मल्टी-बाइट स्ट्रिंग्स का उपयोग करते समय यह मदद करता है।
एंथनी रटलेज

32

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

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

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


1
इसे थोड़ा आगे देखें, तो यह केवल 5.3.6 से पहले के PHP संस्करणों के लिए आवश्यक है। इसे भी देखें: http://stackoverflow.com/a/4361485/2286722 (हालांकि वे एक अलग उपयोग $dbh->exec("set names utf8");करते हैं; मैं यहाँ प्रस्तुत विधि पसंद करता हूँ)। Btw। PHP के मैनुअल में एक टिप्पणी के रूप में इस पर भी एक समान नोट है: php.net/manual/en/pdo.construct.php#96325
मार्टन कोएटिएर


24

मेरे मामले में, मैं उपयोग कर रहा था mb_split, जो रेगेक्स का उपयोग करता है। इसलिए मुझे भी मैन्युअल रूप से सुनिश्चित करना था कि regex एन्कोडिंग utf-8 कर रहा थाmb_regex_encoding('UTF-8');

एक साइड नोट के रूप में, मुझे यह भी पता चला mb_internal_encoding()कि आंतरिक एन्कोडिंग utf-8 नहीं था, और मैंने इसे चलाकर बदल दिया mb_internal_encoding("UTF-8");


22

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

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

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

INTL

अच्छा:

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

खराब:

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

mb_string

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

iconv

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

डेटाबेस

  • mysql: तालिकाओं और कनेक्शन पर तारबंदी और टकराव (टकराव नहीं)। इसके अलावा mysql - msqli या PDO का उपयोग न करें
  • postgresql: pg_set_client_encoding
  • साइक्लाइट (3): सुनिश्चित करें कि इसे यूनिकोड और इंटल सपोर्ट के साथ संकलित किया गया था

कुछ अन्य गोत्र

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

मैं इस जवाब को अपडेट करता हूँ अगर चीजें जुड़ती हैं तो चीजें बदल जाती हैं।


2
हा सही है। मैसिकली और पीडीओ अपने मूल चालकों का उपयोग कर सकते हैं। इसके अलावा वे mysqlnd ड्राइवर का उपयोग कर सकते हैं यदि आप php को --with-mysqli=mysqlnd --with-pdo-mysql=mysqlndविकल्पों के साथ संकलित करेंगे ।
अलेक्जेंडर यानचुक

14

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

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


13

मुझे हाल ही में पता चला है कि उपयोग करना strtolower() उन मुद्दों का कारण बन सकता है जहां एक विशेष चरित्र के बाद डेटा को छोटा किया जाता है।

समाधान का उपयोग करना था

mb_strtolower($string, 'UTF-8');

mb_ मल्टीबाइट का उपयोग करता है। यह अधिक पात्रों का समर्थन करता है लेकिन सामान्य रूप से थोड़ा धीमा है।


9

मैं सिर्फ एक ही मुद्दे से गुजरा हूं और PHP मैनुअल में एक अच्छा समाधान पाया है।

मैंने अपने सभी फ़ाइल एन्कोडिंग को UTF8 में बदल दिया, फिर मेरे कनेक्शन पर डिफ़ॉल्ट एन्कोडिंग। इससे सभी समस्याओं का समाधान हो गया।

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

स्रोत देखें


2
मैंने एक घंटे बिताए एक पृष्ठ पर एक एन्कोडिंग समस्या का पता लगाने की कोशिश कर रहा हूं, जिस पर मैं काम कर रहा हूं और आमतौर पर सामान का पता लगाने में बहुत अच्छा हूं। मैं हमेशा इस पेज से सलाह लेता हूं और आपके जवाब से मुझे बहुत मदद मिली। मेरा उत्थान हुआ। मेरे मामले में, set_charset('utf8mb4')काम नहीं किया लेकिन >set_charset("utf8")किया और वास्तव में अन्य उत्तरों में नहीं दिखाया गया था।
फंक

@FunkFortyNiner सावधान: set_charset("utf8")काम कर सकते हैं, लेकिन अलग ढंग से व्यवहार करेगा (के बीच अंतर के बारे में टिप्पणियों को देखने के utf8और utf8mb4और mysql संस्करण इतिहास)। का प्रयोग करें utf8 अगर आप के लिए है और केवल आप जानते हैं कि आप क्या कर रहे !
मार्टिन हेनिंग्स

5 स्टार्स सॉल्यूशन, मैं एक टेक्स्ट फाइल लाइन लाइन से पढ़ रहा था और प्राप्त कर रहा था? प्रत्येक चरित्र के लिए, तब मैंने एएनआई के बजाय सेव-एफ़ यू किया, utf8 का उपयोग किया। धन्यवाद।
एतेफ फारुक

8

PHP में, आपको या तो मल्टीबाइट फ़ंक्शन का उपयोग करना होगा , या mbstring.func_overload को चालू करना होगा । अगर आपके पास एक से अधिक बाइट लेने वाले अक्षर हैं, तो स्ट्रैलेन जैसी चीजें काम करेंगी।

आपको अपनी प्रतिक्रियाओं के चरित्र सेट की पहचान करने की भी आवश्यकता होगी। आप ऊपर दिए अनुसार AddDefaultCharset का उपयोग कर सकते हैं, या शीर्ष लेख को वापस करने वाले PHP कोड को लिख सकते हैं। (या आप अपने HTML दस्तावेजों में एक मेटा टैग जोड़ सकते हैं।)


Func_overload सेटिंग के बारे में शानदार टिप - मौजूदा कोड के लिए न्यूनतम संशोधन की अनुमति देता है।
सिमोन पूर्व

4
बस सावधान रहें - कुछ कोड वास्तव में मानक स्ट्रिंग फ़ंक्शन के एक-बाइट-प्रति-वर्ण प्रकृति पर निर्भर हो सकते हैं।
जेडब्ल्यू।

यह ध्यान रखना महत्वपूर्ण है कि mbstring.func_overload फ़ीचर को PHP JW की टिप्पणी के ऊपर दिए गए मुद्दों के कारण PHP 7.2 के रूप में चित्रित किया जा रहा है। तो सबसे अच्छी सलाह यह है: हाँ, आपको निश्चित रूप से mbstring फ़ंक्शन का उपयोग करना चाहिए, लेकिन मल्टीबाइट के रूप में काम करने के लिए मानक कार्यों को प्राप्त करने के लिए अधिभार सुविधा का उपयोग न करें।
सिम्बा

6

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

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


6

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

यदि आप UTF8 के अलावा किसी अन्य चीज़ का उपयोग कर रहे हैं, तो इससे परेशानी हो सकती है।


5

शीर्ष उत्तर उत्कृष्ट है। यहाँ मैं एक नियमित debian / php / mysql सेटअप पर क्या करना है:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

बस यही था !


1

यदि आप एक mysql समाधान चाहते हैं, तो सर्वर के माइग्रेशन के बाद, मेरी 2 परियोजनाओं के साथ समान समस्याएं थीं। बहुत सारे समाधान खोजने और आज़माने के बाद मैं इस एक के साथ आया / इस काम से पहले कुछ भी नहीं):

mysqli_set_charset($con,"utf8");

मेरे कॉन्फ़िगर फ़ाइल में इस लाइन को जोड़ने के बाद सब कुछ ठीक काम करता है!

मुझे यह समाधान मिला https://www.w3schools.com/PHP/func_mysqli_set_charset.asp जब मैं html क्वेरी से एक प्रविष्टि को हल करना चाह रहा था

सौभाग्य!


1

सिर्फ एक नोट:

आप अपने गैर-लैटिन वर्णों की समस्या का सामना कर रहे हैं ?????????, जैसा कि आप पूछ रहे हैं, और यह विहित प्रश्न के संदर्भ में बंद हो गया, आपने सब कुछ करने की कोशिश की और कोई फर्क नहीं पड़ता कि आप अभी भी क्या प्राप्त करते हैं?????????? से MySQL

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

एक ताजा डेटा पर इस सवाल के जवाब से आपने जो सीखा है उसे लागू करना आपकी समस्या को हल कर सकता है।


0

टेबल प्रदर्शित करते समय मेरे पास यह मुद्दा था। मैं इसे प्रत्येक इको आउटपुट चर पर डालता हूँ:

<td><?php echo utf8_encode ($Local) ?></td>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.