एन्कोडिंग का पता लगाएं और सब कुछ UTF-8 करें


304

मैं विभिन्न आरएसएस फ़ीड के बहुत सारे पाठ पढ़ रहा हूं और उन्हें अपने डेटाबेस में सम्मिलित कर रहा हूं।

बेशक, फीड्स में उपयोग किए जाने वाले कई अलग-अलग वर्ण एन्कोडिंग हैं, जैसे UTF-8 और ISO 8859-1।

दुर्भाग्य से, ग्रंथों के एन्कोडिंग के साथ कभी-कभी समस्याएं होती हैं। उदाहरण:

  1. "फूबॉल" में "look" को मेरे डेटाबेस में इस तरह दिखना चाहिए: "in"। यदि यह "Ÿ" है, तो इसे सही ढंग से प्रदर्शित किया जाता है।

  2. कभी-कभी, "फ़्यूबॉल" में "," मेरे डेटाबेस में इस तरह दिखता है: "ß"। फिर इसे गलत तरीके से प्रदर्शित किया जाता है।

  3. अन्य मामलों में, "ß" को "-" के रूप में सहेजा जाता है - इसलिए बिना किसी बदलाव के। फिर इसे गलत तरीके से प्रदर्शित भी किया जाता है।

मैं 2 और 3 मामलों से बचने के लिए क्या कर सकता हूं?

मैं सब कुछ समान एन्कोडिंग, अधिमानतः UTF-8 कैसे बना सकता हूं? मुझे कब उपयोग करना चाहिए utf8_encode(), कब उपयोग करना चाहिए utf8_decode()(यह स्पष्ट है कि प्रभाव क्या है, लेकिन मुझे फ़ंक्शन का उपयोग कब करना चाहिए?) और मुझे इनपुट के साथ कुछ भी नहीं करना चाहिए?

मैं सब कुछ समान एन्कोडिंग कैसे बनाऊं? शायद समारोह के साथ mb_detect_encoding()? क्या मैं इसके लिए कोई फ़ंक्शन लिख सकता हूं? तो मेरी समस्याएं हैं:

  1. मुझे कैसे पता चलेगा कि पाठ एन्कोडिंग का उपयोग करता है?
  2. मैं इसे यूटीएफ -8 में कैसे परिवर्तित करूं - पुरानी एन्कोडिंग जो भी हो?

इस काम की तरह एक समारोह होगा?

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

मैंने इसका परीक्षण किया है, लेकिन यह काम नहीं करता है। इसके साथ गलत क्या है?


36
"फ़्यूबॉल" में "look" को मेरे डेटाबेस में इस तरह दिखना चाहिए: "ß"। " नहीं यह ß जैसा दिखना चाहिए। सुनिश्चित करें कि आप टकराव और कनेक्शन सही ढंग से सेट हैं। अन्यथा छंटनी और खोज आपके लिए टूट जाएगी।
रिच ब्रैडशॉ

5
आपका डेटाबेस बुरी तरह से सेटअप है। यदि आप यूनिकोड सामग्री को संग्रहीत करना चाहते हैं, तो उसके लिए इसे कॉन्फ़िगर करें। इसलिए अपने PHP कोड में समस्या को हल करने की कोशिश करने के बजाय, आपको पहले डेटाबेस को ठीक करना चाहिए।
डॉल्मेन

2
उपयोग: = mb_detect_encoding ($ पाठ) से $; $ पाठ = mb_convert_encoding ($ पाठ, 'UTF-8', $ से);
Informate.it

जवाबों:


363

यदि आप utf8_encode()पहले से ही UTF-8 स्ट्रिंग पर लागू होते हैं , तो यह UTF-8 आउटपुट को वापस लौटा देगा।

मैंने एक फ़ंक्शन बनाया जो इस सभी मुद्दों को संबोधित करता है। यह है कहा जाता है Encoding::toUTF8()

आपको यह जानने की जरूरत नहीं है कि आपके तार की एन्कोडिंग क्या है। यह लैटिन 1 ( आईएसओ 8859-1) , विंडोज -1252 या यूटीएफ -8 हो सकता है, या स्ट्रिंग में उनका मिश्रण हो सकता है। Encoding::toUTF8()सब कुछ UTF-8 में बदल देगा।

मैंने ऐसा इसलिए किया क्योंकि एक सेवा मुझे एक ही स्ट्रिंग में यूटीएफ -8 और लैटिन 1 को मिलाते हुए सभी डेटा को फीड कर रही थी।

उपयोग:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

डाउनलोड:

https://github.com/neitanod/forceutf8

मैंने एक और फ़ंक्शन शामिल किया है Encoding::fixUFT8(), जो हर UTF-8 स्ट्रिंग को ठीक करेगा जो कि विकृत दिखती है।

उपयोग:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

उदाहरण:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

उत्पादन होगा:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

मैंने फ़ंक्शन ( forceUTF8) को क्लास नामक स्थैतिक कार्यों के एक परिवार में बदल दिया है Encoding। नए कार्य है Encoding::toUTF8()


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

3
गैर-UTF8 वर्णों को UTF8 में कैसे परिवर्तित किया जाता है, बिना यह जाने कि अमान्य वर्णों को एन्कोडिंग किसके साथ शुरू करना है?
फिल्पेरो

4
यह ISO-8859-1 मानता है, जवाब पहले से ही यह कहता है। ForceUTF8 () और utf8_encode () के बीच एकमात्र अंतर यह है कि forceUTF8 () UTF8 वर्णों को पहचानता है और उन्हें अपरिवर्तित रखता है।
सेबेस्टियन ग्रिग्नोली

28
"आपको यह जानने की आवश्यकता नहीं है कि आपके तार की एन्कोडिंग क्या है।" - मैं बहुत असहमत हूं। अनुमान लगाना और कोशिश करना काम कर सकता है, लेकिन आप हमेशा या बाद में किनारे के मामलों का सामना करेंगे जहां यह नहीं होता है।
deceze

4
मैं पूरी तरह सहमत हूँ। वास्तव में, मुझे यह बताने का कोई मतलब नहीं था कि एक सामान्य नियम के रूप में, बस यह समझाएं कि यह वर्ग आपकी मदद कर सकता है यदि आप अपने आप को खोजने के लिए ऐसी स्थिति में हैं।
सेबेस्टियन ग्रिग्नोली

74

आपको पहले यह पता लगाना होगा कि एन्कोडिंग का क्या उपयोग किया गया है। जैसा कि आप आरएसएस फ़ीड (शायद HTTP के माध्यम से) पार्स कर रहे हैं, आपको HTTP हेडर फ़ील्ड के charsetपैरामीटर से एन्कोडिंग को पढ़ना चाहिए । यदि यह मौजूद नहीं है, तो XML प्रसंस्करण निर्देश की विशेषता से एन्कोडिंग पढ़ें । यदि वह भी गायब है, तो विनिर्देश में परिभाषित UTF-8 का उपयोग करेंContent-Typeencoding


   यहाँ संपादित करें कि मैं शायद क्या करूँगा:

मैं प्रतिक्रिया भेजने और लाने के लिए CURL का उपयोग करूंगा । इससे आप विशिष्ट हेडर फ़ील्ड सेट कर सकते हैं और प्रतिक्रिया हेडर भी प्राप्त कर सकते हैं। प्रतिक्रिया लाने के बाद, आपको HTTP प्रतिक्रिया को पार्स करना होगा और इसे हेडर और बॉडी में विभाजित करना होगा। शीर्ष लेख में तब Content-Typeहेडर फ़ील्ड होना चाहिए जिसमें MIME प्रकार होता है और (उम्मीद है कि) charsetएन्कोडिंग / चारसेट के साथ पैरामीटर भी। यदि नहीं, तो हम encodingविशेषता की उपस्थिति के लिए XML PI का विश्लेषण करेंगे और वहां से एन्कोडिंग प्राप्त करेंगे। यदि वह भी गायब है, तो XML चश्मा UTF-8 को एन्कोडिंग के रूप में उपयोग करने के लिए परिभाषित करता है।

$url = 'http://www.lr-online.de/storage/rss/rss/sport.xml';

$accept = array(
    'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
    'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
);
$header = array(
    'Accept: '.implode(', ', $accept['type']),
    'Accept-Charset: '.implode(', ', $accept['charset']),
);
$encoding = null;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($curl);
if (!$response) {
    // error fetching the response
} else {
    $offset = strpos($response, "\r\n\r\n");
    $header = substr($response, 0, $offset);
    if (!$header || !preg_match('/^Content-Type:\s+([^;]+)(?:;\s*charset=(.*))?/im', $header, $match)) {
        // error parsing the response
    } else {
        if (!in_array(strtolower($match[1]), array_map('strtolower', $accept['type']))) {
            // type not accepted
        }
        $encoding = trim($match[2], '"\'');
    }
    if (!$encoding) {
        $body = substr($response, $offset + 4);
        if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $body, $match)) {
            $encoding = trim($match[1], '"\'');
        }
    }
    if (!$encoding) {
        $encoding = 'utf-8';
    } else {
        if (!in_array($encoding, array_map('strtolower', $accept['charset']))) {
            // encoding not accepted
        }
        if ($encoding != 'utf-8') {
            $body = mb_convert_encoding($body, 'utf-8', $encoding);
        }
    }
    $simpleXML = simplexml_load_string($body, null, LIBXML_NOERROR);
    if (!$simpleXML) {
        // parse error
    } else {
        echo $simpleXML->asXML();
    }
}

धन्यवाद। यह आसान होगा। लेकिन क्या यह वास्तव में काम करेगा? अक्सर HTTP हेडर या XML की विशेषताओं में दिए गए गलत एनकोडिंग हैं।
कांव-कांव

25
दोबारा: यह आपकी समस्या नहीं है। ऐसी परेशानियों से बचने के लिए मानक स्थापित किए गए थे। यदि दूसरे उनका अनुसरण नहीं करते हैं, तो यह उनकी समस्या है, आपकी नहीं।
गम्बू

ठीक है, मुझे लगता है कि आपने मुझे अब आश्वस्त कर दिया है। :)
कांव-कांव

कोड के लिए धन्यवाद। लेकिन क्यों नहीं बस इस का उपयोग करें? paste.bradleygill.com/index.php?paste_id=9651 आपका कोड बहुत अधिक जटिल है, इसके लिए क्या बेहतर है?
कांव-कांव

ठीक है, सबसे पहले आप दो अनुरोध कर रहे हैं, एक HTTP हेडर के लिए और एक डेटा के लिए। दूसरे, आप में से किसी उपस्थिति के लिए देख रहे charset=हैं और encoding=न सिर्फ उचित स्थानों पर। और तीसरा, आप यह जाँच नहीं कर रहे हैं कि घोषित एन्कोडिंग स्वीकार किया गया है या नहीं।
गुमबो

39

एन्कोडिंग का पता लगाना कठिन है।

mb_detect_encodingअनुमान लगाकर काम करता है, कई उम्मीदवारों के आधार पर जो आप इसे पास करते हैं। कुछ एन्कोडिंग्स में, कुछ बाइट-सीक्वेंस अमान्य हैं, इसलिए यह विभिन्न उम्मीदवारों के बीच अंतर कर सकता है। दुर्भाग्य से, बहुत सारे एनकोडिंग हैं, जहां एक ही बाइट्स वैध हैं (लेकिन अलग-अलग)। इन मामलों में, एन्कोडिंग निर्धारित करने का कोई तरीका नहीं है; आप इन मामलों में अनुमान लगाने के लिए अपने स्वयं के तर्क को लागू कर सकते हैं। उदाहरण के लिए, जापानी साइट से आने वाले डेटा में जापानी एन्कोडिंग होने की अधिक संभावना हो सकती है।

जब तक आप केवल पश्चिमी यूरोपीय भाषाओं के साथ व्यवहार करते हैं, पर विचार करने के लिए तीन प्रमुख एनकोडिंग हैं utf-8, iso-8859-1और cp-1252। चूंकि ये कई प्लेटफार्मों के लिए चूक हैं, इसलिए उन्हें गलत तरीके से रिपोर्ट किए जाने की सबसे अधिक संभावना है। उदाहरण के लिए। यदि लोग अलग-अलग एन्कोडिंग का उपयोग करते हैं, तो वे इसके बारे में स्पष्ट होने की संभावना रखते हैं, क्योंकि उनका सॉफ़्टवेयर बहुत बार टूट जाएगा। इसलिए, एक अच्छी रणनीति प्रदाता पर भरोसा करना है, जब तक कि एन्कोडिंग उन तीनों में से एक के रूप में रिपोर्ट नहीं किया जाता है। आपको अभी भी डबलचेक करना चाहिए कि यह वास्तव में वैध है, mb_check_encoding(ध्यान दें कि वैध होने के समान नहीं है - एक ही इनपुट कई एन्कोडिंग के लिए मान्य हो सकता है)। यदि यह उनमें से एक है, तो आप उपयोग कर सकते हैंmb_detect_encodingउनके बीच अंतर करना। सौभाग्य से यह काफी नियतात्मक है; आपको बस उचित पता-अनुक्रम का उपयोग करने की आवश्यकता है, जो कि है UTF-8,ISO-8859-1,WINDOWS-1252

एक बार जब आप एन्कोडिंग का पता लगा लेते हैं तो आपको इसे अपने आंतरिक प्रतिनिधित्व में बदलने की आवश्यकता होती है ( UTF-8यह एकमात्र एकमात्र विकल्प है)। फ़ंक्शन में utf8_encodeबदल ISO-8859-1जाता है UTF-8, इसलिए इसका उपयोग केवल उस विशेष इनपुट प्रकार के लिए किया जा सकता है। अन्य एन्कोडिंग के लिए, का उपयोग करें mb_convert_encoding


आपका बहुत बहुत धन्यवाद! बेहतर क्या है: mb- कन्वर्ट-एन्कोडिंग () या iconv ()? मुझे नहीं पता कि अंतर क्या हैं। हां, मुझे केवल पश्चिमी यूरोपीय भाषाओं, विशेष रूप से अंग्रेजी, जर्मन और फ्रेंच को पार्स करना होगा।
कांव-कांव

7
मैंने अभी देखा है: mb-detect-एन्कोडिंग () यह बेकार नहीं है। यह केवल UTF-8, UTF-7, ASCII, EUC-JP, SJIS, eucJP-win, SJIS-win, JIS और ISO-2022-JP का समर्थन करता है। मेरे लिए सबसे महत्वपूर्ण, ISO-8859-1 और WINDOWS-1252, समर्थित नहीं हैं। इसलिए मैं mb-detect-एन्कोडिंग () का उपयोग नहीं कर सकता।
कांव-कांव

1
मेरी, तुम सही हो। जब से मैंने इसका उपयोग किया है तब से यह एक समय है। फिर आपको अपना स्वयं का पता-कोड लिखना होगा, या बाहरी उपयोगिता का उपयोग करना होगा। UTF-8 को काफी मज़बूती से निर्धारित किया जा सकता है, क्योंकि इसके भागने के क्रम काफी विशिष्ट हैं। wp-1252 और iso-8859-1 को प्रतिष्ठित किया जा सकता है क्योंकि wp-1252 में बाइट्स हो सकते हैं जो iso-8859-1 में अवैध हैं। विवरण प्राप्त करने के लिए विकिपीडिया का उपयोग करें, या php.net के टिप्पणियों-अनुभाग में, विभिन्न चार्ट-संबंधित कार्यों के तहत देखें।
troelskn

मुझे लगता है कि आप अलग-अलग एन्कोडिंग को भेद कर सकते हैं जब आप उन रूपों को देखते हैं जो विशेष रूप से उभरते हैं: जर्मन "in" विभिन्न रूपों में उभरता है: कभी-कभी "Ÿ", कभी-कभी "Ã" और कभी-कभी "ß"। क्यों?
कांव-कांव

हां, लेकिन फिर आपको इसकी तुलना करने से पहले स्ट्रिंग की सामग्री को जानना होगा, और इस तरह का उद्देश्य पहले स्थान पर हार जाता है। जर्मन German अलग तरह से प्रकट होता है क्योंकि इसमें अलग-अलग एन्कोडिंग में अलग-अलग मूल्य हैं। विभिन्न वर्णों में एक ही तरह से समरूप वर्णों का प्रतिनिधित्व किया जाता है (जैसे कि एससीआई वर्ण में सभी वर्ण utf-8, iso-8859- * और wp-1252) में उसी तरह कूटबद्ध होते हैं, जब तक आप उपयोग करते हैं बस उन पात्रों, वे सभी एक जैसे दिखते हैं। इसलिए उन्हें कुछ समय के लिए अस्सी-संगत कहा जाता है।
troelskn

14

एक वास्तव में एक को लागू करने के अच्छा तरीका isUTF8समारोह पर पाया जा सकता php.net :

function isUTF8($string) {
    return (utf8_encode(utf8_decode($string)) == $string);
}

16
दुर्भाग्य से, यह केवल तब काम करता है जब स्ट्रिंग में केवल ऐसे अक्षर होते हैं जो ISO-8859-1 में शामिल होते हैं। लेकिन यह काम कर सकता है: @iconv ('utf-8', 'utf-8 // IGNORE', $ str) == $ str
क्रिश्चियन डेवन

@ क्रिसियन: दरअसल, यही है कि उच्च प्रदर्शन MySQL के लेखक भी सलाह देते हैं।
एलिक्स एक्सल

1
इसका सही ढंग से काम नहीं करता है: इको (int) isUTF8 ('z'); # 1 प्रतिध्वनि (int) .UTF8 (NULL); # 1
Yousha Aleayoub

1
हालांकि सही नहीं है, मुझे लगता है कि यह स्केच यूटीएफ -8 जांच को लागू करने का एक अच्छा तरीका है।
मटेंग

1
mb_check_encoding($string, 'UTF-8')
deceze

13

यह चीटशीट PHP में UTF-8 हैंडलिंग से संबंधित कुछ सामान्य चेतावनी को सूचीबद्ध करता है: http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

एक स्ट्रिंग में मल्टीबाइट वर्णों का पता लगाने वाला यह कार्य सहायक भी साबित हो सकता है ( स्रोत ):


function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);
}


2
मुझे लगता है कि यह सही ढंग से काम नहीं करता है: इको डिटेक्टएफ 8 ('3 '3'); # 1
Yousha Aleayoub

10

थोड़ा सिर ऊपर। आपने कहा कि "said" को आपके डेटाबेस में "in" के रूप में प्रदर्शित किया जाना चाहिए।

यह संभवतः इसलिए है क्योंकि आप लैटिन -1 वर्ण एन्कोडिंग वाले डेटाबेस का उपयोग कर रहे हैं या संभवतः आपका PHP-MySQL कनेक्शन गलत है, यह है, P का मानना ​​है कि आपका MySQL UTF-8 का उपयोग करने के लिए सेट है, इसलिए यह UTF-8 के रूप में डेटा भेजता है , लेकिन आपका MySQL मानता है कि PHP ISO 8859-1 के रूप में एन्कोडेड डेटा भेज रहा है, इसलिए यह एक बार फिर आपके भेजे गए डेटा को UTF-8 के रूप में एन्कोड करने का प्रयास कर सकता है, जिससे इस तरह की परेशानी होती है।

Mysql_set_charset पर एक नज़र डालें । यह आपकी मदद कर सकता है।


4

आपका एन्कोडिंग ऐसा लगता है जैसे आपने UTF-8 में दो बार एनकोड किया ; वह है, कुछ अन्य एन्कोडिंग से, UTF-8 में, और फिर से UTF-8 में। जैसे कि आपके पास ISO 8859-1 था, ISO 8859-1 से UTF-8 में परिवर्तित हो गया, और UTF-8 में एक और रूपांतरण के लिए ISO को 8859-1 के रूप में नया स्ट्रिंग माना।

यहाँ कुछ छद्म कोड है जो आपने किया:

$inputstring = getFromUser();
$utf8string = iconv($current_encoding, 'utf-8', $inputstring);
$flawedstring = iconv($current_encoding, 'utf-8', $utf8string);

तुम्हें कोशिश करनी चाहिए:

  1. एन्कोडिंग का उपयोग करके mb_detect_encoding()या जो भी आप उपयोग करना चाहते हैं उसका पता लगाएं
  2. यदि यह UTF-8 है, तो ISO 8859-1 में बदलें, और चरण 1 को दोहराएं
  3. अंत में, वापस UTF-8 में परिवर्तित करें

यह मानते हुए कि "मध्य" रूपांतरण में आपने ISO 8859-1 का उपयोग किया है। यदि आपने Windows-1252 का उपयोग किया है, तो Windows-1252 (latin1) में परिवर्तित करें। मूल स्रोत एन्कोडिंग महत्वपूर्ण नहीं है; आपने जो त्रुटिपूर्ण उपयोग किया है, वह दूसरा रूपांतरण है।

यह मेरा अनुमान है कि क्या हुआ; वहाँ बहुत कम आप एक विस्तारित ASCII बाइट के स्थान पर चार बाइट प्राप्त करने के लिए किया जा सकता है।

जर्मन भाषा आईएसओ 8859-2 और विंडोज -1250 (लैटिन -2) का भी उपयोग करती है


3

के बारे में दिलचस्प बात यह mb_detect_encodingऔर mb_convert_encodingहै कि इनकोडिंग आप का सुझाव के आदेश फर्क पड़ता है है:

// $input is actually UTF-8

mb_detect_encoding($input, "UTF-8", "ISO-8859-9, UTF-8");
// ISO-8859-9 (WRONG!)

mb_detect_encoding($input, "UTF-8", "UTF-8, ISO-8859-9");
// UTF-8 (OK)

इसलिए आप अपेक्षित एन्कोडिंग को निर्दिष्ट करते समय एक विशिष्ट ऑर्डर का उपयोग कर सकते हैं। फिर भी, ध्यान रखें कि यह मूर्खतापूर्ण नहीं है।


2
ऐसा इसलिए होता है क्योंकि ISO-8859-9 किसी भी बाइनरी इनपुट को स्वीकार करेगा। वही Windows-1252 और दोस्तों के लिए जाता है। आपको पहले एनकोडिंग के लिए परीक्षण करना होगा जो इनपुट को स्वीकार करने में विफल हो सकता है।
मिक्को रैंटलैनेन

@MikkoRantalainen, हाँ, मुझे लगता है कि डॉक्स के इस हिस्से कुछ इसी तरह का कहना है: php.net/manual/en/function.mb-detect-order.php#example-2985
हलील Özgür

यह देखते हुए कि WHATWG HTML कल्पना डिफ़ॉल्ट एन्कोडिंग के रूप में विंडोज 1252 को परिभाषित करती है, यह मान लेना बहुत सुरक्षित होना चाहिए if ($input_is_not_UTF8) $input_is_windows1252 = true;। इसे भी देखें: html.spec.whatwg.org/multipage/…
मिकीको रैंटलैनेन

3

आपको इनपुट पर सेट चरित्र का परीक्षण करने की आवश्यकता है क्योंकि प्रतिक्रियाएं विभिन्न एन्कोडिंग के साथ कोडित हो सकती हैं।

निम्नलिखित फ़ंक्शन का उपयोग करके मुझे पता लगाने और अनुवाद करके सभी सामग्री को UTF-8 में भेजा गया है:

function fixRequestCharset()
{
  $ref = array(&$_GET, &$_POST, &$_REQUEST);
  foreach ($ref as &$var)
  {
    foreach ($var as $key => $val)
    {
      $encoding = mb_detect_encoding($var[$key], mb_detect_order(), true);
      if (!$encoding)
        continue;
      if (strcasecmp($encoding, 'UTF-8') != 0)
      {
        $encoding = iconv($encoding, 'UTF-8', $var[$key]);
        if ($encoding === false)
          continue;
        $var[$key] = $encoding;
      }
    }
  }
}

यह रूटीन उन सभी PHP चरों को चालू करेगा जो दूरस्थ होस्ट से UTF-8 में आते हैं।

या मान को अनदेखा करें यदि एन्कोडिंग का पता नहीं लगाया जा सकता है या परिवर्तित नहीं किया जा सकता है।

आप इसे अपनी आवश्यकताओं के लिए अनुकूलित कर सकते हैं।

बस चर का उपयोग करने से पहले इसे लागू करें।


एन्कोडिंग सूची में पारित किए बिना mb_detect_order () का उपयोग करने का उद्देश्य क्या है?
जियोर्जियो

इसका उद्देश्य उपयोग किए गए php.ini में परिभाषित एनकोडिंग के क्रमबद्ध कॉन्फ़िगर किए गए सिस्टम को वापस करना है। तीसरे पैरामीटर को भरने के लिए mb_detect_encoding द्वारा यह आवश्यक है।
कैविला

2

RSS फ़ीड्स के वर्ण एन्कोडिंग से कार्य करना जटिल प्रतीत होता है । यहां तक ​​कि सामान्य वेब पेज भी अक्सर, उनके एन्कोडिंग के बारे में झूठ बोलते हैं या झूठ बोलते हैं।

तो आप एन्कोडिंग का पता लगाने के लिए सही तरीके का उपयोग करने की कोशिश कर सकते हैं और फिर ऑटो-डिटेक्शन (अनुमान लगाने) के कुछ रूप में वापस आ सकते हैं।


मैं फ़ीड जानकारी से एन्कोडिंग को पढ़ना नहीं चाहता। यदि फ़ीड जानकारी गलत है तो यह बराबर है। मैं पाठ से एन्कोडिंग का पता लगाना चाहूंगा।
कांव-कांव

@ marco92w: घोषित एनकोडिंग गलत है तो यह आपकी समस्या नहीं है। मनोरंजन के लिए मानक स्थापित नहीं किए गए हैं।
गुमबो

1
@ गंबो: लेकिन अगर आप वास्तविक दुनिया में काम कर रहे हैं तो आपको गलत घोषित एनकोडिंग जैसी चीजों से निपटने में सक्षम होना चाहिए। समस्या यह है कि केवल कुछ पाठ से एन्कोडिंग को सही ढंग से अनुमान लगाना बहुत मुश्किल है। मानक अद्भुत हैं, लेकिन पेजों / फीडों के कई (अधिकांश) उनके अनुपालन नहीं करते हैं।
केविन ओरोर्के

@ केविन ओरोर्के: बिल्कुल सही। यही मेरी समस्या है। @ गुम्बो: हाँ, यह मेरी समस्या है। मैं फ़ीड्स पढ़ना चाहता हूं और उन्हें एकत्र करना चाहता हूं। इसलिए मुझे गलत एनकोडिंग को सही करना चाहिए।
कांव-कांव

@ marco92w: लेकिन अगर आप सही एन्कोडिंग और वर्तमान एन्कोडिंग को नहीं जानते हैं तो आप एन्कोडिंग को सही नहीं कर सकते। और यह है कि क्या charset/ के लिए encodingघोषणा: यदि एन्कोडिंग का वर्णन डेटा इनकोडिंग है।
गंबो

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि एक उपयोगी जवाब कभी नहीं दर्द होता है। मैं एक डेस्कटॉप अनुप्रयोग, SQLite और GET / POST चर के बीच अपने एन्कोडिंग के साथ समस्याएँ आ रहा था। कुछ UTF-8 में होंगे, कुछ ASCII में होंगे, और मूल रूप से विदेशी पात्रों के शामिल होने पर सब कुछ खराब हो जाएगा।

यहाँ मेरा समाधान है। यह प्रसंस्करण के दौरान प्रत्येक पृष्ठ पर आपके GET / POST / REQUEST (मैं छोड़ी गई कुकीज़ को छोड़ देता हूं, लेकिन वांछित होने पर आप उन्हें जोड़ सकता है)। यह एक हेडर में अच्छी तरह से काम करता है। यदि यह स्रोत स्वचालित रूप से एन्कोडिंग का पता नहीं लगा सकता है, तो PHP चेतावनी को फेंक देगा, इसलिए ये चेतावनियां @ के साथ दबा दी जाती हैं।

//Convert everything in our vars to UTF-8 for playing nice with the database...
//Use some auto detection here to help us not double-encode...
//Suppress possible warnings with @'s for when encoding cannot be detected
try
{
    $process = array(&$_GET, &$_POST, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = $v;
                $process[] = &$process[$key][@mb_convert_encoding($k,'UTF-8','auto')];
            } else {
                $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = @mb_convert_encoding($v,'UTF-8','auto');
            }
        }
    }
    unset($process);
}
catch(Exception $ex){}

उत्तर के लिए धन्यवाद, jocull फ़ंक्शन mb_convert_encoding () वही है जो हम पहले से ही यहाँ, है ना? ;) इसलिए आपके उत्तर में एकमात्र नई चीज सभी चर में एन्कोडिंग को बदलने के लिए छोरें हैं।
कांव-कांव

2

मैं उम्र से एन्कोडिंग के समाधान के लिए जाँच कर रहा था , और यह पृष्ठ शायद खोज के वर्षों का निष्कर्ष है! मैंने आपके द्वारा बताए गए कुछ सुझावों का और यहाँ मेरे नोट्स का परीक्षण किया:

यह मेरी परीक्षा स्ट्रिंग है:

यह एक "wrìng wrìtten" string bòt I nèed to p "'sòme' विशेष chàrs है जिसे देखने के लिए thèm, Convertèd by fùnctìon !! & बस!

मैं इस स्ट्रिंग को इस क्षेत्र में एक डेटाबेस पर सहेजने के लिए एक INSERT करता हूं जो इस प्रकार सेट किया गया है utf8_general_ci

मेरे पृष्ठ का वर्ण सेट UTF-8 है।

अगर मैं एक INSERT ऐसा ही करता हूं, तो मेरे डेटाबेस में, मेरे पास कुछ पात्र हैं जो संभवतः मंगल ग्रह से आ रहे हैं ...

इसलिए मुझे उन्हें कुछ "समझदार" UTF-8 में बदलने की आवश्यकता है। मैंने कोशिश की utf8_encode(), लेकिन फिर भी एलियन चार्ट मेरे डेटाबेस पर आक्रमण कर रहे थे ...

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

यह एक "wròng wrìtten" स्ट्रिंग है, मैं इस दिन को देखने के लिए विशेष chà rs के लिए pò¹ sùme 'के लिए nà "ed हूं, कन्वर्ट एक fā¹nct¬on द्वारा !! & बस!

इसलिए इस पृष्ठ पर कुछ और जानकारी एकत्र करना और उन्हें अन्य जानकारी के साथ अन्य पृष्ठों पर मर्ज करना मैंने इस समस्या को हल किया है:

$finallyIDidIt = mb_convert_encoding(
  $string,
  mysql_client_encoding($resourceID),
  mb_detect_encoding($string)
);

अब मेरे डेटाबेस में सही एन्कोडिंग के साथ मेरा स्ट्रिंग है।

नोट: केवल ध्यान रखना समारोह में है mysql_client_encoding! आपको डेटाबेस से कनेक्ट होने की आवश्यकता है, क्योंकि यह फ़ंक्शन पैरामीटर के रूप में एक संसाधन आईडी चाहता है।

लेकिन ठीक है, मैं सिर्फ अपने INSERT के सामने फिर से एन्कोडिंग करता हूं ताकि मेरे लिए यह कोई समस्या न हो।


1
आप UTF-8पहली बार में mysql के लिए क्लाइंट एन्कोडिंग का उपयोग क्यों नहीं करते हैं ? इस तरह से मैन्युअल रूप से रूपांतरण की आवश्यकता नहीं होगी
Esailija

2

यह सरल है: जब आपको कुछ मिलता है जो UTF-8 नहीं है, तो आपको उस UTF-8 में एनकोड करना होगा ।

इसलिए, जब आप एक निश्चित फ़ीड प्राप्त कर रहे होते हैं, जो आईएसओ 8859-1 है, तो इसे पार करें utf8_encode

हालाँकि, यदि आप UTF-8 फ़ीड प्राप्त कर रहे हैं, तो आपको कुछ भी करने की आवश्यकता नहीं है।


धन्यवाद! ठीक है, मुझे पता चल सकता है कि mb-detect-एन्कोडिंग (), सही का उपयोग करके फ़ीड कैसे एन्कोड किया गया है? लेकिन अगर फ़ीड ASCII है तो मैं क्या कर सकता हूं? utf8-encode () ist is only for ISO-8859-1 to UTF-8, है ना?
पंजा

ASCII ISO-8859-1 और UTF-8 का एक उपसमूह है, इसलिए utf8-encode () का उपयोग करके परिवर्तन नहीं करना चाहिए - यदि यह वास्तव में सिर्फ ASCII है
माइकल बोर्गवर्ड

तो मैं हमेशा यूटीएफ -8 का उपयोग कर सकता हूं अगर यह यूटीएफ -8 नहीं है? यह वास्तव में आसान होगा। पाठ जो ASCII के अनुसार mb-detect- एन्कोडिंग () में निहित है "& # 228;"। क्या यह ASCII चरित्र है? या यह HTML है?
पंजा

वह HTML है। वास्तव में यह एन्कोडेड है जब आप इसे दिए गए पृष्ठ में प्रिंट करते हैं तो यह ठीक दिखाई देता है। यदि आप चाहते हैं कि आप पहले ut8_encode () तब html_entity_decode () कर सकें।
सेब

1
चरित्र ß बाइट अनुक्रम 0xC39F के साथ UTF-8 में एन्कोडेड है। Windows-1252 के साथ व्याख्या की गई, यह अनुक्रम दो वर्णों (0xC3) और Ÿ (0x9F) का प्रतिनिधित्व करता है। और यदि आप इस बाइट अनुक्रम को UTF-8 के साथ फिर से एन्कोड करते हैं, तो आपको 0xC383 0xC29F मिलेगा जो विंडोज -1252 में Ã what का प्रतिनिधित्व करता है। तो आपकी गलती इस UTF-8 एनकोडेड डेटा को UTF-8 के अलावा किसी एन्कोडिंग के साथ संभालने की है। इस बाइट अनुक्रम को उस चरित्र के रूप में प्रस्तुत किया जाता है जिसे आप देख रहे हैं, यह केवल व्याख्या का विषय है। यदि आप एक अन्य एन्कोडिंग / चारसेट का उपयोग करते हैं, तो आप शायद अन्य वर्ण देखेंगे।
गंबू

1

php.net/mb_detect_encoding

echo mb_detect_encoding($str, "auto");

या

echo mb_detect_encoding($str, "UTF-8, ASCII, ISO-8859-1");

मुझे वास्तव में नहीं पता है कि परिणाम क्या हैं, लेकिन मैं आपको सुझाव दूंगा कि आप अपने कुछ फीड्स को अलग-अलग एन्कोडिंग के साथ लें और कोशिश करें कि mb_detect_encodingकाम करता है या नहीं।

अपडेट करें
ऑटो "ASCII, JIS, UTF-8, EUC-JP, SJIS" के लिए छोटा है। यह पता लगाया हुआ चारसेट लौटाता है, जिसे आप आइकॉन के साथ स्ट्रिंग को utf-8 में बदलने के लिए उपयोग कर सकते हैं ।

<?php
function convertToUTF8($str) {
    $enc = mb_detect_encoding($str);

    if ($enc && $enc != 'UTF-8') {
        return iconv($enc, 'UTF-8', $str);
    } else {
        return $str;
    }
}
?>

मैंने इसका परीक्षण नहीं किया है, इसलिए कोई गारंटी नहीं है। और शायद वहाँ एक सरल तरीका है।


धन्यवाद। दूसरे तर्क के रूप में 'ऑटो' और 'UTF-8, ASCII, ISO-8859-1' में क्या अंतर है? क्या 'ऑटो' में अधिक एनकोडिंग की सुविधा है? फिर 'ऑटो' का इस्तेमाल करना बेहतर होगा, नहीं? यदि यह वास्तव में बिना किसी बग के काम करता है तो मुझे केवल "ASCII" या "ISO-8859-1" को "UTF-8" में बदलना होगा। कैसे?
कांव-कांव

2
आपका कार्य सभी मामलों में अच्छा काम नहीं करता है। कभी-कभी मुझे एक त्रुटि मिलती है: सूचना: iconv (): इनपुट स्ट्रिंग में एक अवैध चरित्र का पता लगाया ...
caw

1

@harpax ने मेरे लिए काम किया। मेरे मामले में, यह काफी अच्छा है:

if (isUTF8($str)) { 
    echo $str; 
}
else
{
    echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $str);
}

0

अपनी php स्क्रिप्ट्स को छाँटने के बाद, mysql को यह बताना न भूलें कि आप किस चैराहे से गुजर रहे हैं और फिर से सोचना चाहते हैं।

उदाहरण: सेट वर्ण सेट utf8

Utf8 डेटा को एक लेट 1 I / O सत्र में एक लेट 1 टेबल पर भेजना उन घिनौने बर्डफ़ेट्स को देता है। मैं इसे हर दूसरे दिन ऑस्करकॉम की दुकानों में देखता हूं। पीछे और चौथा यह सही लग सकता है। लेकिन phpmyadmin सच दिखाएगा। Mysql को यह बताने से कि आप किस चारसेट से गुजर रहे हैं, यह आपके लिए mysql डेटा के रूपांतरण को नियंत्रित करेगा।

मौजूदा तले हुए mysql डेटा को पुनर्प्राप्त करने के लिए कैसे चर्चा करने के लिए एक और धागा है। :)


0

यह संस्करण जर्मन भाषा के लिए है लेकिन आप $ CHARSETS और $ TESTCHARS को संशोधित कर सकते हैं

class CharsetDetector
{
private static $CHARSETS = array(
"ISO_8859-1",
"ISO_8859-15",
"CP850"
);
private static $TESTCHARS = array(
"€",
"ä",
"Ä",
"ö",
"Ö",
"ü",
"Ü",
"ß"
);
public static function convert($string)
{
    return self::__iconv($string, self::getCharset($string));
}
public static function getCharset($string)
{
    $normalized = self::__normalize($string);
    if(!strlen($normalized))return "UTF-8";
    $best = "UTF-8";
    $charcountbest = 0;
    foreach (self::$CHARSETS as $charset) {
        $str = self::__iconv($normalized, $charset);
        $charcount = 0;
        $stop   = mb_strlen( $str, "UTF-8");

        for( $idx = 0; $idx < $stop; $idx++)
        {
            $char = mb_substr( $str, $idx, 1, "UTF-8");
            foreach (self::$TESTCHARS as $testchar) {

                if($char == $testchar)
                {

                    $charcount++;
                    break;
                }
            }
        }
        if($charcount>$charcountbest)
        {
            $charcountbest=$charcount;
            $best=$charset;
        }
        //echo $text."<br />";
    }
    return $best;
}
private static function __normalize($str)
{

$len = strlen($str);
$ret = "";
for($i = 0; $i < $len; $i++){
    $c = ord($str[$i]);
    if ($c > 128) {
        if (($c > 247)) $ret .=$str[$i];
        elseif ($c > 239) $bytes = 4;
        elseif ($c > 223) $bytes = 3;
        elseif ($c > 191) $bytes = 2;
        else $ret .=$str[$i];
        if (($i + $bytes) > $len) $ret .=$str[$i];
        $ret2=$str[$i];
        while ($bytes > 1) {
            $i++;
            $b = ord($str[$i]);
            if ($b < 128 || $b > 191) {$ret .=$ret2; $ret2=""; $i+=$bytes-1;$bytes=1; break;}
            else $ret2.=$str[$i];
            $bytes--;
        }
    }
}
return $ret; 
}
private static function __iconv($string, $charset)
{
    return iconv ( $charset, "UTF-8" , $string );
}
}


0

हेडर से एन्कोडिंग प्राप्त करें और इसे utf-8 में बदलें।

$post_url='http://website.domain';

/// Get headers ////////////////////////////////////////////////////////////
function get_headers_curl($url) 
{ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL,            $url); 
    curl_setopt($ch, CURLOPT_HEADER,         true); 
    curl_setopt($ch, CURLOPT_NOBODY,         true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT,        15); 

    $r = curl_exec($ch); 
    return $r; 
}
$the_header = get_headers_curl($post_url);
/// check for redirect /////////////////////////////////////////////////
if (preg_match("/Location:/i", $the_header)) {
    $arr = explode('Location:', $the_header);
    $location = $arr[1];

    $location=explode(chr(10), $location);
    $location = $location[0];

$the_header = get_headers_curl(trim($location));
}
/// Get charset /////////////////////////////////////////////////////////////////////
if (preg_match("/charset=/i", $the_header)) {
    $arr = explode('charset=', $the_header);
    $charset = $arr[1];

    $charset=explode(chr(10), $charset);
    $charset = $charset[0];
    }
///////////////////////////////////////////////////////////////////////////////
// echo $charset;

if($charset && $charset!='UTF-8') { $html = iconv($charset, "UTF-8", $html); }

0

ŸMojibake के लिए है ß। आपके डेटाबेस में, आपके पास हेक्स हो सकता है

DF if the column is "latin1",
C39F if the column is utf8 -- OR -- it is latin1, but "double-encoded"
C383C5B8 if double-encoded into a utf8 column

आपको PHP में किसी भी एन्कोडिंग / डिकोडिंग फ़ंक्शन का उपयोग नहीं करना चाहिए ; इसके बजाय, आपको डेटाबेस और कनेक्शन को सही ढंग से सेट करना चाहिए।

यदि MySQL शामिल है, तो देखें: utf8 वर्णों के साथ परेशानी; मैं जो देखता हूं वह वह नहीं है जो मैंने संग्रहीत किया है


0

मैं यहां समाधान ढूंढता हूं http://deer.org.ua/2009/10/06/1/

class Encoding
{
    /**
     * http://deer.org.ua/2009/10/06/1/
     * @param $string
     * @return null
     */
    public static function detect_encoding($string)
    {
        static $list = ['utf-8', 'windows-1251'];

        foreach ($list as $item) {
            try {
                $sample = iconv($item, $item, $string);
            } catch (\Exception $e) {
                continue;
            }
            if (md5($sample) == md5($string)) {
                return $item;
            }
        }
        return null;
    }
}

$content = file_get_contents($file['tmp_name']);
$encoding = Encoding::detect_encoding($content);
if ($encoding != 'utf-8') {
    $result = iconv($encoding, 'utf-8', $content);
} else {
    $result = $content;
}

मुझे लगता है कि @ बुरा निर्णय है, और deer.org.ua से समाधान के लिए कुछ बदलाव करें;


0

सबसे ज्यादा वोट दिया गया जवाब काम नहीं करता है। यहाँ मेरा है और आशा है कि यह मदद करता है।

function toUTF8($raw) {
    try{
        return mb_convert_encoding($raw, "UTF-8", "auto"); 
    }catch(\Exception $e){
        return mb_convert_encoding($raw, "UTF-8", "GBK"); 
    }
}

1
क्या आपके पास कोई अंतर्दृष्टि है क्यों, या आपकी फाइलें कैसे अलग थीं? आपके लिए कौन से हिस्से काम नहीं आए? उदाहरण के लिए: अपरकेस जर्मन अक्षर सही रूप से परिवर्तित नहीं हुए। जिज्ञासु, "GBK" क्या है?
शेरलहोमन

-1

जब आप जापानी और कोरियाई जैसी बहु भाषाओं को संभालने की कोशिश करते हैं तो आप मुश्किल में पड़ सकते हैं। 'ऑटो' पैरामीटर के साथ mb_convert_encoding अच्छी तरह से काम नहीं करता है। Mb_detect_order ('ASCII, UTF-8, JIS, EUC-JP, SJIS, EUC-KR, UHC') सेट करना मदद नहीं करता है क्योंकि यह EUC- * का गलत तरीके से पता लगाएगा।

मैंने निष्कर्ष निकाला कि जब तक इनपुट स्ट्रिंग्स HTML से आती है, तब तक इसे मेटा एलिमेंट में 'चारसेट' का उपयोग करना चाहिए। मैं Simple HTML DOM Parser का उपयोग करता हूं क्योंकि यह अमान्य HTML का समर्थन करता है।

नीचे स्निपेट एक वेब पेज से शीर्षक तत्व निकालता है। यदि आप पूरे पृष्ठ को रूपांतरित करना चाहते हैं, तो आप कुछ पंक्तियों को हटाना चाह सकते हैं।

<?php
require_once 'simple_html_dom.php';

echo convert_title_to_utf8(file_get_contents($argv[1])), PHP_EOL;

function convert_title_to_utf8($contents)
{
    $dom = str_get_html($contents);
    $title = $dom->find('title', 0);
    if (empty($title)) {
        return null;
    }
    $title = $title->plaintext;
    $metas = $dom->find('meta');
    $charset = 'auto';
    foreach ($metas as $meta) {
        if (!empty($meta->charset)) { // html5
            $charset = $meta->charset;
        } else if (preg_match('@charset=(.+)@', $meta->content, $match)) {
            $charset = $match[1];
        }
    }
    if (!in_array(strtolower($charset), array_map('strtolower', mb_list_encodings()))) {
        $charset = 'auto';
    }
    return mb_convert_encoding($title, 'UTF-8', $charset);
}

-1

मेरे पास phpQuery के साथ एक ही मुद्दा था ( UT -8 के बजाय ISO-8859-1 ) और इस हैक ने मेरी मदद की:

$html = '<?xml version="1.0" encoding="UTF-8" ?>' . $html;

mb_internal_encoding('UTF-8'), phpQuery::newDocumentHTML($html, 'utf-8'), mbstring.internal_encodingऔर अन्य जोड़तोड़ कोई असर नहीं लिया।


-1

'ऑटो' के बिना कोशिश करें

अर्थात्:

mb_detect_encoding($text)

के बजाय:

mb_detect_encoding($text, 'auto')

अधिक जानकारी यहां पाई जा सकती है: mb_detect_encoding

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.