पीएचपी आउटपुट प्रश्न चिह्न के साथ छोटे काले हीरे दिखा रहा है


81

मैं एक php प्रोग्राम लिख रहा हूँ जो एक डेटाबेस स्रोत से खींचता है। Varchars के कुछ उद्धरण है कि उन्हें में एक प्रश्न चिह्न के साथ काले हीरे के रूप में प्रदर्शित कर रहे हैं (, है प्रतिस्थापन वर्ण , मैं माइक्रोसॉफ्ट वर्ड पाठ से मान)।

मैं इन पात्रों को बाहर निकालने के लिए php का उपयोग कैसे कर सकता हूं?


1
उन्हें पट्टी न करें, समय ठीक करें। भी "काला हीरा" में देखें stackoverflow.com/questions/38363566/...
रिक जेम्स

जवाबों:


75

यदि आप उस चरित्र (+ U + FFFD "REPLACEMENT CHARACTER") को देखते हैं, तो इसका आम तौर पर अर्थ है कि पाठ स्वयं एकल बाइट एन्कोडिंग के किसी न किसी रूप में एन्कोडेड है, लेकिन इसकी व्याख्या यूनिकोड एनकोडिंग (UTF8 या UTF16) में से एक में की गई है।

अगर यह इसके आसपास का दूसरा तरीका होता (आमतौर पर) कुछ इस तरह से होता: ä।

संभवतः मूल एन्कोडिंग ISO-8859-1 है, जिसे लैटिन -1 के रूप में भी जाना जाता है। आप अपनी स्क्रिप्ट बदलने के बिना इसकी जांच कर सकते हैं: ब्राउज़र आपको एक अलग एन्कोडिंग में पृष्ठ को फिर से व्याख्या करने का विकल्प देता है - फ़ायरफ़ॉक्स में "व्यू" -> "कैरेक्टर एन्कोडिंग" का उपयोग करें।

ब्राउज़र को सही एन्कोडिंग का उपयोग करने के लिए, इस तरह एक HTTP हेडर जोड़ें:

header("Content-Type: text/html; charset=ISO-8859-1");

या मेटा टैग में एन्कोडिंग डालें:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

वैकल्पिक रूप से आप डेटाबेस से दूसरे एन्कोडिंग (UTF-8, अधिमानतः) में पढ़ने या पाठ को बदलने की कोशिश कर सकते हैं iconv()


अब तक यह निकटतम समाधान है। हालाँकि, अब मेरे पास एक मेटा है: <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8"> और मैं iconv का उपयोग iso-8859-1 से utf- में बदलने के लिए कर रहा हूँ 8, सही अब 0096 और 0092 respivley विशेष ('या -) किसी भी अन्य विचारों के साथ एक बॉक्स के रूप में दिखा?

हां, मेरे पास एक और विचार है: कुछ होमवर्क करें ... आपने शायद गलत स्रोत एन्कोडिंग का उपयोग किया है। 0x92 और 0x96 खिड़कियों -1252 में "घुमावदार एकल उद्धरण" और "डैश" हैं। क्या यह सही हो सकता है? क्या आपने ब्राउज़र-चाल की कोशिश की है?

PDF2Text वर्ग का उपयोग करते समय PHP हेडर ने मेरे लिए चीजें तय कीं।
जेम्स पी।

नहीं header("Content-Type: text/plain; charset=ISO-8859-1");होना चाहिए header("Content-Type: text/html; charset=ISO-8859-1");?
j08691

@ j08691: ठीक है, यह अब सामग्री के प्रकार पर निर्भर करता है, है ना?

41

यह एक चारसेट इश्यू है। जैसे, यह कई अलग-अलग स्तरों पर गलत हो सकता है, लेकिन सबसे अधिक संभावना है, आपके डेटाबेस में तार utf-8 एन्कोडेड हैं, और आप उन्हें iso-8859-1 के रूप में प्रस्तुत कर रहे हैं। या फिर इसके विपरीत।

इस समस्या को ठीक करने का उचित तरीका है, अपने चरित्र-सेट को सीधे प्राप्त करना। सरलतम रणनीति, चूंकि आप PHP का उपयोग कर रहे हैं, अपने पूरे आवेदन में iso-8859-1 का उपयोग करना है। ऐसा करने के लिए, आपको यह सुनिश्चित करना होगा कि:

  • सभी PHP स्रोत-फ़ाइलों को iso-8859-1 (cp-1252 के साथ भ्रमित नहीं होना) के रूप में सहेजा जाता है।
  • आपका वेब-सर्वर फ़ाइलों के साथ सेवा करने के लिए कॉन्फ़िगर किया गया है charset=iso-8859-1
  • वैकल्पिक रूप से, आप उपयोग करते हुए PHP- दस्तावेज़ के भीतर से वेबसर्वर सेटिंग्स को ओवरराइड कर सकते हैं header
  • इसके अलावा, आप HTML में एक मेटा-टैग सम्मिलित कर सकते हैं , जो एक ही बात को निर्दिष्ट करता है, लेकिन इसकी सख्त आवश्यकता नहीं है।
  • आप कर सकते हैं यह भी निर्दिष्ट कर accept-charsetअपने पर विशेषता <form>तत्वों।
  • डेटाबेस तालिकाओं को लैटिन 1 के रूप में एन्कोडिंग के साथ परिभाषित किया गया है
  • PHP से डेटाबेस के बीच का डेटाबेस कनेक्शन latin1 पर सेट है

यदि आपके डेटाबेस में पहले से ही डेटा है, तो आपको पता होना चाहिए कि वे संभवतः पहले से ही गड़बड़ हैं। यदि आप पहले से ही उत्पादन के चरण में नहीं हैं, तो बस इसे मिटा दें और शुरू करें। अन्यथा आपको कुछ डेटा क्लीनअप करना होगा।

मेटा-टैग पर एक नोट, क्योंकि हर कोई गलतफहमी है कि वे क्या हैं:

जब एक वेब-सर्वर एक फ़ाइल (ए-एचटीएमएल-दस्तावेज़) परोसता है, तो यह कुछ जानकारी भेजता है, जो सीधे ब्राउज़र में प्रस्तुत नहीं की जाती है। इसे HTTP-हेडर्स के रूप में जाना जाता है। ऐसा ही एक हेडर है, Content-Typeहेडर, जो फ़ाइल के mimetype (जैसे text/html) को निर्दिष्ट करता है और साथ ही एन्कोडिंग (उर्फसेट) को भी निर्दिष्ट करता है । जबकि अधिकांश वेबसर्वर जानकारी के Content-Typeसाथ एक हेडर भेजेंगे charset, यह वैकल्पिक है। यदि यह मौजूद नहीं है, तो ब्राउज़र इसके बजाय किसी मेटा-टैग की व्याख्या करेगा http-equiv="Content-Type"। यह महसूस करना महत्वपूर्ण है कि मेटा-टैग की केवल व्याख्या की जाती है यदि वेबसर्वर हेडर नहीं भेजता है। व्यवहार में इसका मतलब है कि इसका उपयोग केवल तभी किया जाता है जब पृष्ठ को डिस्क पर सहेजा जाता है और फिर वहां से खोला जाता है।

इस पृष्ठ में इन बातों की बहुत अच्छी व्याख्या है।


38

मुझे इस। मुद्दे का भी सामना करना पड़ा। इस बीच मैं तीन मामलों में भाग गया जहाँ यह हुआ:

  1. पदार्थ ()

    मैं substr()एक UTF8 स्ट्रिंग का उपयोग कर रहा था , जो UTF8 वर्णों को काटती है, इस प्रकार कट वर्णों को सही ढंग से प्रदर्शित नहीं किया जा सकता है। mb_substr($utfstring, 0, 10, 'utf-8');इसके बजाय उपयोग करें । क्रेडिट

  2. htmlspecialchars ()

    एक और समस्या htmlspecialchars()UTF8 स्ट्रिंग का उपयोग कर रही थी । उपयोग करने के लिए ठीक है:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace ()

    अंत में मुझे पता चला कि preg_replace()UTF के साथ समस्याएं हो सकती हैं। $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);उदाहरण के लिए कोड ने UTF स्ट्रिंग "F (×) = 2 × -3" को "F 2 " में बदल दिया। इसके mb_ereg_replace()बजाय उपयोग करने के लिए ठीक है ।

मुझे उम्मीद है कि यह अतिरिक्त जानकारी ऐसी समस्याओं से छुटकारा पाने में मदद करेगी।


2
ठीक वही समस्या थी जो मैं झेल रहा था। एमबी स्ट्रिंग कार्यों के बारे में पता नहीं था।
रेन

1
यह strtolowerफंक्शन के लिए भी हुआ । PHP के मैनुअल
micaball

13

जैसा कि पहले के उत्तर में बताया गया है, ऐसा इसलिए हो रहा है क्योंकि आपका पाठ डेटाबेस में iso-8859-1एन्कोडिंग या किसी अन्य प्रारूप में लिखा गया है ।

इसलिए आपको utf8इसे आउटपुट करने से पहले डेटा को परिवर्तित करने की आवश्यकता है।

$text = “string from database”;
$text = utf8_encode($text);
echo $text;

11

यह सुनिश्चित करने के लिए कि आपका MYSQL कनेक्शन UTF-8 (या latin1 पर सेट है, आप क्या उपयोग कर रहे हैं) के आधार पर, आप यह कर सकते हैं:

$con = mysql_connect("localhost","username","password");    
mysql_set_charset('utf8',$con);

या इसका उपयोग यह जांचने के लिए करें कि आप किस वर्ण का उपयोग कर रहे हैं:

$con = mysql_connect("localhost","username","password");   
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n"; 

अधिक जानकारी यहाँ: http://php.net/manual/en/function.mysql-set-charset.php


यह एक बहुत उपयोगी था और एक दूरस्थ MySQL डेटाबेस से आने वाले डेटा में मेरे उद्धरण एन्कोडिंग मुद्दे को हल किया, धन्यवाद!
जनजातीय

@ptwiggerl ने इससे बहुत मदद की।
यूनिक्मिया

मैंने एक वेबसाइट को दूसरे सर्वर पर भेज दिया और मुझे इस समस्या का सामना करना पड़ा, mysql_set_charset ('utf8', $ con); उसे हल कर लिया!
राफेल मोनी

5

समस्या के आपके विवरण के आधार पर, आपके डेटाबेस में डेटा लगभग निश्चित रूप से विंडोज -1252 के रूप में एन्कोडेड है , और आपके पेज को लगभग निश्चित रूप से आईएसओ-8859-1 के रूप में परोसा जा रहा है । ये दो वर्ण सेट समतुल्य हैं सिवाय इसके कि Windows-1252 में 16 अतिरिक्त वर्ण हैं जो ISO-8859-1 में मौजूद नहीं हैं, जिनमें बाएँ और दाएँ घुंघराले उद्धरण शामिल हैं।

मेरे विश्लेषण को सही मानते हुए, सरलतम उपाय यह है कि आप अपने पृष्ठ को Windows-1252 के रूप में परोसें। यह काम करेगा क्योंकि सभी अक्षर जो कि ISO-8859-1 में हैं, वे विंडोज -1252 में भी हैं। PHP में आप एन्कोडिंग को इस प्रकार बदल सकते हैं:

header('Content-Type: text/html; charset=Windows-1252');

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


इस सुझाव के साथ समस्या यह है कि सबसे अधिक संभावना है कि डेटा इस बिंदु पर विभिन्न वर्णों का मिश्रण है। यदि आपको ठीक से पता नहीं है कि क्या गलत हुआ है, तो यह और भी गड़बड़ हो जाता है, अगर आप यहां और वहां कुछ यादृच्छिक सुधारों को फेंक देते हैं।
troelskn

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

यह मेरा अवलोकन भी बहुत सुंदर है। मैं जो देखभाल करता हूं, उसके लिए वे बोते हैं। लेकिन तुम शायद सही हो; संभावना है कि उसका डेटा वास्तव में cp-1252 है .. कम से कम इसमें से कुछ है।
troelskn

मैं एक ही मुद्दे के समाधान का एक गुच्छा की कोशिश की। यह एक कम से कम प्रयास के साथ तुरंत प्रभावी था
छः

4

मैंने ऐसा करने के लिए इन पात्रों को स्ट्रिंग से बाहर करने का विकल्प चुना -

ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');

1
यह बहुत बढ़िया है, इसने मेरे लिए काम किया, utf8_encode और ut8_decode को भी आज़माया- काम नहीं किया। लेकिन इस समाधान ने मेरे मामले में काम किया। धन्यवाद।
संजीव शेट्टी

4

इस फ़ंक्शन को अपने चरों में जोड़ें utf8_encode ($ चर);


कृपया इस उत्तर पर विस्तार से बताएं।
ppovoski

1
यह वह फ़ंक्शन है जो आपको विशेष चरित्र को हटाने की अनुमति देता है और आपको चरित्र का utf8 मानक देता है google.com/…
rk_programmer

यह उन अंशों के साथ काम करता है जिन्हें सही ढंग से प्रदर्शित नहीं किया गया था।
Rog

मेरी राय में, ये एक स्वीकृत उत्तर होना चाहिए; यह एकमात्र तरीका है जो मेरे लिए काम करता है, मैंने इसकी पूरी कोशिश की।
क्वांटम

4

बस इस कोड को पेज के शीर्ष पर शुरू करने में पेस्ट करें।

<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>

कृपया एक संक्षिप्त विवरण शामिल करें कि कोड क्या करता है।
सीटी हॉल

1
यह php कोड "ISO-8859-1" के कैरेक्टर सेट को अनुमति देने के लिए और इस कैरेक्टर सेट में इस सिंबल को एक कैरेक्टर के रूप में दिखाया गया है।
हर्षिल कनेरिया



1

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


1

मैंने अपनी तालिकाएँ तय करने के बाद अंत में जो किया, उसे पूरा करने के लिए और सेटिंग्स को वापस करने के लिए utf-8 में बदल दिया, फिर मैंने अपनी डंप फ़ाइल को बदल दिया ताकि DEFAULT CHARACTER SET utf8 COLLATE utf8_neneral_ci मेरे चरित्र सेट प्रविष्टियाँ हों

अब मेरे पास वर्ण समस्याएँ नहीं हैं क्योंकि डेटाबेस और ब्राउज़र utf8 हैं।

मुझे लगा कि इसका क्या कारण है। यह DB पर वेब पेज + ब्राउज़र प्रभाव था। टर्मिनलों पर जो कि linux (ubuntu + firefox) है, यह डेटाबेस को लैटिन 1 में एन्कोडिंग कर रहा था जो कि टैब सेट हैं। लेकिन विंडोज़ 10 + एज टर्मिनलों पर, प्रविष्टियों को utf8 में कोडित किया गया था। इसके अलावा, मैंने देखा कि विंडोज़ 10 में लैट 1 के साथ रहने के मुद्दे हैं इसलिए मैंने हवा के साथ झुकने और सभी को यूएफ 8 में बदलने का फैसला किया।

मुझे लगा कि यह एक विंडोज़ 10 का मुद्दा था क्योंकि हमने 10 टर्मिनलों का उपयोग शुरू किया था। इसलिए अभी तक फिर से Microsoft बग समस्याओं का कारण बनता है। मुझे अभी भी नहीं पता है कि एन्कोडिंग रूपों पर परिवर्तन क्यों होता है क्योंकि विंडोज़ 10 में ब्राउज़र लैटिन 1 वर्ण प्रदर्शित करता है लेकिन जब यह अपने utf8 में जाता है तो एन्कोड किया जाता है और मुझे डेटा विसंगति मिलती है। लेकिन लिनक्स में + फ़ायरफ़ॉक्स यह ऐसा नहीं करता है।


1

यह मेरे मामले में काम करने के लिए हुआ:

$text = utf8_decode($text)

मैं काले हीरे के चरित्र को एक प्रश्न चिह्न में बदल देता हूं ताकि आप कर सकें:

$text = str_replace('?', '', utf8_decode($text));

1
$text = खंड के बारे में चेतावनी : यह स्ट्रिंग के भीतर सभी सवालों के निशान को बदल देगा, न कि केवल हीरे को
treyBake

1

हेडर से पहले इन लाइनों को जोड़ें।

.doc/docxफ़ाइलों का सटीक प्रारूप पुनर्प्राप्त किया जाएगा:

 if(ini_get('zlib.output_compression'))

   ini_set('zlib.output_compression', 'Off');
 ob_clean();

0

आप अपने ब्राउज़र में सेट किए गए बैक्टीरिया को भी बदल सकते हैं। बस डिबग कारणों के लिए।


0

डेटाबेस और HTML दोनों में एक ही चारसेट (जैसा कि यहां बताया गया है) का उपयोग करना मेरे लिए काम नहीं किया है ... इसलिए यह याद रखना कि कोड HTML के रूप में उत्पन्न हुआ है, मैंने &quot;(HTML कोड) या &#34;(ISO लैटिन -1 ) का उपयोग करने का विकल्प चुना मेरे डेटाबेस पाठ में कोड) जहां उद्धरण का उपयोग किया गया था। इसने मुझे उद्धरण चिह्न प्रदान करते हुए समस्या को हल किया। यह ध्यान रखना अजीब है कि इस समाधान से पहले, केवल कुछ उद्धरण चिह्नों और एपोस्ट्रोफिस ने सही ढंग से प्रदर्शित नहीं किया, जबकि अन्य ने किया, हालांकि, सभी उदाहरणों में विशेष कोड ने काम किया।


0

मैंने phpmyadmin में अपने टकराव परिवर्तन के बाद "एन्कोडिंग एन्कोडिंग" कोड चलाया और अब यह लैटिन_1 के रूप में आता है।

लेकिन यहाँ कुछ ऐसा है जो मुझे अपने आवेदन में एक अलग डेटा विसंगति को देखकर आया है और मैंने इसे कैसे तय किया:

मैंने सिर्फ एक तालिका आयात की है जिसमें मिश्रित एन्कोडिंग है (कुछ पंक्तियों में हीरे के प्रश्न चिह्न के साथ, और सभी एक ही कॉलम में थे।) इसलिए यहां मेरा फिक्स कोड है। मैंने utf8_decode प्रक्रिया का उपयोग किया, जो अपरिभाषित प्लेसहोल्डर को लेती है और "डायमंड प्रश्न चिह्न" के स्थान पर एक सादे प्रश्न चिह्न लगाती है, फिर मैंने उद्धरण के बीच के स्थान के साथ प्रश्न चिह्न को बदलने के लिए str_replace का उपयोग किया। यहाँ [कोड] है

    include 'dbconnectfile.php';

  //// the variable $db comes from my db connect file
   /// inx is my auto increment column
   /// broke_column is the column I need to fix

      $qwy = "select inx,broke_column from Table ";
      $res = $db->query($qwy); 

      while ($data = $res->fetch_row()) {
      for ($m=0; $m<$res->field_count; $m++) {
           if ($m==0){ 
           $id=0;
           $id=$data[$m];
       echo $id;
           }else if ($m==1){ 
             $fix=0;
             $fix=$data[$m];


             $fix = utf8_decode($fix);
             $fixx =str_replace("?"," ",$fix);

        echo $fixx;

        ////I echoed the data to the screen because I like to see something as I execute it :)
            }
            }
         $insert= "UPDATE Table SET broke_column='".$fixx."'  where inx='".$id."'";
          $insresult= $db->query($insert);
      echo"<br>";
        }

        ?>        

उपरोक्त कोड मेरी तालिका को ठीक करता है। लेकिन मैं अपडेट स्टेटमेंट पर टिप्पणी करने की सलाह दूंगा ताकि आप पहले देख सकें कि क्या यह समस्या को ठीक करने वाला है।
23

0

वैश्विक उद्देश्यों के लिए।

प्रत्येक पाठ को परिवर्तित करने, संहिताबद्ध करने, कोडित करने के बजाय, मैं उन्हें वैसे ही रहने देना पसंद करता हूं और इसके बजाय सर्वर php सेटिंग्स को बदलता हूं। इसलिए,

  1. हीरों को रहने दो

  2. ब्राउज़र से, दृश्य मेनू पर "टेक्स्ट एन्कोडिंग" का चयन करें और वह ढूंढें जो आप अपने पाठ को सही ढंग से देखते हैं।

  3. अपना php.ini संपादित करें और जोड़ें:

    default_charset = "ISO-8859-1"

या ISO-8859 के बजाय जो आपके टेक्स्ट एन्कोडिंग को फिट करता है।


0

जब आप कहीं से डेटा निकालते हैं, तो आपको उपसर्ग के साथ फ़ंक्शन का उपयोग करना चाहिए md_FUNC_NAME

अगर यही समस्या थी तो इससे मुझे मदद मिली।

या आप इस प्रतीक का कोड पा सकते हैं और इन प्रतीकों को हटाने के लिए regexp का उपयोग कर सकते हैं।


-2

अपने phpmyadmin पर जाएं और अपने डेटाबेस का चयन करें और बस उस तालिका के फ़ील्ड की लंबाई / मान को 500 या 1000 तक बढ़ाएं यह आपकी समस्या को हल करेगा।

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