"" के बजाय पृष्ठ पर "एक € ™" दिखा रहा है


133

’अपने पन्ने पर के बजाय दिखाया जा रहा है '

मेरे पास मेरे टैग और मेरे HTTP हेडर दोनों में Content-Typeसेट है :UTF-8<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

यहाँ छवि विवरण दर्ज करें

इसके अलावा, मेरा ब्राउज़र Unicode (UTF-8)निम्न पर सेट है :

यहाँ छवि विवरण दर्ज करें

तो समस्या क्या है, और मैं इसे कैसे ठीक कर सकता हूं?


जवाबों:


55

सुनिश्चित करें कि ब्राउज़र और संपादक ISO-8859-1 / Windows-1252 के बजाय UTF-8 एन्कोडिंग का उपयोग कर रहे हैं।

या उपयोग करें &rsquo;


75
नहीं, यह हल नहीं है। आपके एप्लिकेशन में अभी भी वर्ण एन्कोडिंग में एक असंगतता है। आप भविष्य में अन्य गैर- CP1252 वर्णों के लिए इसी समस्या का फिर से सामना करेंगे। और उनमें से बहुत सारे हैं ...
BalusC

12
ऐसे पात्रों के उदाहरण जिन्हें आप मुठभेड़ जारी रखेंगे: i18nqa.com/debug/utf8-debug.html
Zoot

utf-8 एन्कोडिंग +1
करुहांगा

217

तो समस्या क्या है,

यह ( RIGHT SINGLE QUOTATION MARK- U + 2019) वर्ण है जिसे UTF-8 के बजाय CP-1252 के रूप में डिकोड किया जा रहा है । यदि आप एन्कोडिंग तालिका की जांच करते हैं , तो आप देखते हैं कि यह चरित्र यूटीएफ -8 में बाइट्स से बना है , और । यदि आप CP-1252 कोड पेज लेआउट की जांच करते हैं , तो आप देखेंगे कि उनमें से प्रत्येक बाइट व्यक्तिगत पात्रों के लिए खड़ा है , और ।0xE20x800x99â


और मैं इसे कैसे ठीक कर सकता हूं?

अक्षरों को पढ़ने, लिखने, स्टोर करने और प्रदर्शित करने के लिए CP-1252 के बजाय UTF-8 का उपयोग करें।


मेरे पास मेरे <head>टैग और मेरे HTTP हेडर दोनों में UTF-8 के लिए सामग्री-प्रकार सेट है :

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

यह केवल उस क्लाइंट को निर्देश देता है जो वर्णों की व्याख्या और प्रदर्शित करने के लिए एन्कोडिंग का उपयोग करता है। यह आपके स्वयं के प्रोग्राम को निर्देश नहीं देता है जो कि पात्रों को पढ़ने, लिखने, स्टोर करने और प्रदर्शित करने के लिए उपयोग करने के लिए एन्कोडिंग है। सटीक उत्तर सर्वर साइड प्लेटफॉर्म / डेटाबेस / प्रोग्रामिंग भाषा पर निर्भर करता है। ध्यान दें कि HTTP प्रतिसाद शीर्ष लेख में एक सेट HTML मेटा टैग पर पूर्ववर्ती है। एचटीएमएल मेटा टैग का उपयोग केवल तब किया जाएगा जब पृष्ठ HTTP से बजाय स्थानीय डिस्क फ़ाइल सिस्टम से खोला जाता है।


इसके अलावा, मेरा ब्राउज़र Unicode (UTF-8)निम्न पर सेट है :

यह केवल क्लाइंट को मजबूर करता है जो वर्णों की व्याख्या और प्रदर्शित करने के लिए एन्कोडिंग का उपयोग करता है। लेकिन वास्तविक समस्या यह है कि आप ’ग्राहक को पहले से ही (UTF-8 में एन्कोडेड) भेज रहे हैं । क्लाइंट सही ढंग ’से UTF-8 एन्कोडिंग का उपयोग कर प्रदर्शित कर रहा है। यदि क्लाइंट का उपयोग करने के लिए गलत सूचना दी गई थी, उदाहरण के लिए ISO-8859-1, तो आप संभवतः ââ¬â¢इसके बजाय देखेंगे ।


मैं एक डेटाबेस के साथ ASP.NET 2.0 का उपयोग कर रहा हूं।

यह सबसे अधिक संभावना है जहां आपकी समस्या निहित है। आपको एक स्वतंत्र डेटाबेस टूल के साथ सत्यापित करने की आवश्यकता है कि डेटा कैसा दिखता है।

यदि चरित्र है, तो आप डेटाबेस से सही तरीके से नहीं जुड़ रहे हैं। आपको UTF-8 का उपयोग करने के लिए डेटाबेस कनेक्टर को बताने की आवश्यकता है।

यदि आपका डेटाबेस शामिल है ’, तो यह आपका डेटाबेस है जो गड़बड़ है। अधिकांश संभवतः तालिकाओं का उपयोग करने के लिए कॉन्फ़िगर नहीं किया गया है UTF-8। इसके बजाय, वे डेटाबेस के डिफ़ॉल्ट एन्कोडिंग का उपयोग करते हैं, जो कॉन्फ़िगरेशन के आधार पर भिन्न होता है। यदि यह आपका मुद्दा है, तो आमतौर पर यूटीएफ -8 का उपयोग करने के लिए केवल तालिका को बदलना ही पर्याप्त है। यदि आपका डेटाबेस उसका समर्थन नहीं करता है, तो आपको तालिकाओं को फिर से बनाना होगा। जब आप इसे बनाते हैं तो टेबल की एन्कोडिंग सेट करना अच्छा अभ्यास होता है।

आप SQL सर्वर का उपयोग करने की सबसे अधिक संभावना रखते हैं, लेकिन यहां कुछ MySQL कोड ( इस लेख से कॉपी किए गए ) हैं:

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

यदि आपकी तालिका पहले से ही UTF-8 है, तो आपको एक कदम पीछे ले जाने की आवश्यकता है। किसने या क्या डेटा वहां डाला। यहीं समस्या है। एक उदाहरण HTML फॉर्म जमा किए गए मान होंगे जो गलत तरीके से एन्कोडेड / डिकोड किए गए हैं।


समस्या के बारे में अधिक जानने के लिए यहां कुछ और लिंक दिए गए हैं:


2
यदि आपने इस तरह की सामग्री को कहीं सहेजा है जैसे कि mysql डेटाबेस में, stackoverflow.com/a/9407998/117647 में चाल है जो आपको वर्णों को utf-8 में बदलने की आवश्यकता है
स्टीव

5
टी एल; डॉ; वर्णों को पढ़ने, लिखने, संग्रह करने और प्रदर्शित करने के लिए UTF-8 का उपयोग करें।
c0degeas

ध्यान दें कि iso-8859-1 और Windows-1252 टेबल ओवरलैप होते हैं, इसलिए कुछ "अजीब वर्ण संयोजन" दोनों के लिए आम हैं (उदाहरण के लिए "é" के लिए "é")।
स्किप्पी ले ग्रैंड गौरू

15

मेरे पास कुछ दस्तावेज हैं, जैसा कि दिखा रहा था …और êजैसा दिखा रहा था ê। यह इस प्रकार है कि वहाँ (अजगर कोड):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

समस्या को ठीक करने के लिए, मैंने इस तरह अजगर कोड का उपयोग किया:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(क्योंकि किसी ने ट्विंगल्ड संस्करण को एक सही UTF-8 दस्तावेज़ में डाला था, मुझे वास्तव में केवल ट्विंगल्ड भाग को निकालना था, इसे अलग करना और वापस इसमें सम्मिलित करना था। मैंने इसके लिए ब्यूटीफुल का उपयोग किया।)

यह कहीं अधिक संभावना है कि आपके पास सामग्री निर्माण में चार्ली है कि वेब सर्वर कॉन्फ़िगरेशन गलत है। आप अपने वेब ब्राउज़र को utf-8 डॉक्यूमेंट के लिए windows-1252 एन्कोडिंग का चयन करके पृष्ठ को घुमा देने के लिए बाध्य कर सकते हैं। आपके वेब ब्राउज़र ने उस दस्तावेज़ को नहीं देखा है जिसे चार्ली ने सहेजा था।

नोट : वही समस्या किसी भी अन्य सिंगल-बाइट कोड पेज (जैसे कि लैटिन -1) के साथ विंडोज़ -1252 के बजाय हो सकती है।


14

(यूनिकोड कोडपॉइंट U+2019 RIGHT SINGLE QUOTATION MARK) को यूटीएफ -8 में बाइट्स के रूप में एनकोड किया गया है:

0xE2 0x80 0x99

’(यूनिकोड कोडपॉइंट्स U+00E2 U+20AC U+2122) को यूटीएफ -8 में बाइट्स के रूप में एनकोड किया गया है:

0xC3 0xA2   0xE2 0x82 0xAC   0xE2 0x84 0xA2

ये वो बाइट्स हैं जो आपके ब्राउज़र को वास्तव में तब प्राप्त करने के लिए प्राप्त होते हैं ’जब UTF-8 के रूप में संसाधित किया जाता है।

इसका अर्थ है कि आपका स्रोत डेटा ब्राउज़र पर भेजे जाने से पहले दो चारसेट रूपांतरणों से गुजर रहा है:

  1. स्रोत वर्ण ( U+2019) पहले UTF-8 बाइट्स के रूप में एन्कोडेड है:

    0xE2 0x80 0x99

  2. उन व्यक्तिगत बाइट्स तो जा रहे थे गलत व्याख्या की और यूनिकोड कोड पॉइंट्स को डीकोड U+00E2 U+20AC U+2122में से एक ने विंडोज 125X वर्णसेट (1252, 1254, 1256, और 1258 सब नक्शा 0xE2 0x80 0x99करने के लिए U+00E2 U+20AC U+2122), और फिर उन कोड पॉइंट्स UTF-8 बाइट्स के रूप में एन्कोड किया जा रहा है:

    0xE2-> U+00E2-> 0xC3 0xA2
    0x80-> U+20AC-> 0xE2 0x82 0xAC
    0x99-> U+2122->0xE2 0x84 0xA2

आपको यह खोजने की आवश्यकता है कि चरण 2 में अतिरिक्त रूपांतरण कहां किया जा रहा है और इसे हटा दें।


12

यह कभी-कभी ऐसा होता है जब एक स्ट्रिंग को दो बार विंडोज -1252 से यूटीएफ -8 में बदल दिया जाता है ।

हमारे पास Zend / PHP / MySQL एप्लिकेशन में ऐसा था जहां वर्ण जो डेटाबेस में दिखाई दे रहे थे, संभवतः MySQL कनेक्शन के कारण सही वर्ण सेट निर्दिष्ट नहीं कर रहे हैं। हमें करना पड़ा:

  1. सुनिश्चित करें कि Zend और PHP UTF-8 में डेटाबेस के साथ संचार कर रहे थे ( डिफ़ॉल्ट रूप से नहीं था )

  2. इस तरह कई SQL प्रश्नों के साथ टूटे हुए पात्रों की मरम्मत करें ...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    यह आवश्यक के रूप में कई तालिकाओं / स्तंभों के लिए करें।

यदि आवश्यक हो तो आप पीएचपी में इनमें से कुछ तारों को भी ठीक कर सकते हैं। ध्यान दें कि क्योंकि पात्रों इनकोडिंग किया गया है दो बार , हम वास्तव में एक रिवर्स रूपांतरण करने की ज़रूरत से विंडोज़ -1252 के लिए UTF-8 वापस है, जो मुझे पहली बार में उलझन में।

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’

9

आपके चरित्र एन्कोडिंग में एक बेमेल है; आपकी स्ट्रिंग एक एन्कोडिंग (UTF-8) में एन्कोड की गई है और जो कुछ भी इस पृष्ठ की व्याख्या कर रहा है वह दूसरे का उपयोग कर रहा है (ASCII कहते हैं)।

हमेशा अपने http हेडर में अपनी एन्कोडिंग निर्दिष्ट करें और सुनिश्चित करें कि यह आपके फ्रेमवर्क की एन्कोडिंग की परिभाषा से मेल खाता है।

नमूना http हेडर:

Content-Type    text/html; charset=utf-8

Asp.net में एन्कोडिंग सेट करना

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Jsp में एन्कोडिंग सेट करना


7

यदि आपकी सामग्री का प्रकार पहले से ही UTF8 है, तो संभावना है कि डेटा पहले से ही गलत एन्कोडिंग में आ रहा है। यदि आप डेटाबेस से डेटा प्राप्त कर रहे हैं, तो सुनिश्चित करें कि डेटाबेस कनेक्शन UTF-8 का उपयोग करता है।

यदि यह किसी फ़ाइल का डेटा है, तो सुनिश्चित करें कि फ़ाइल सही रूप से UTF-8 के रूप में एन्कोडेड है। आप इसे आमतौर पर "अपनी पसंद के रूप में सहेजें ..." में सेट कर सकते हैं।

यदि स्रोत फ़ाइल में देखने पर डेटा पहले से ही टूटा हुआ है, तो संभावना है कि यह एक UTF-8 फ़ाइल हुआ करता था, लेकिन रास्ते में कहीं गलत एन्कोडिंग में सहेजा गया था।


4

यदि किसी को वर्डप्रेस वेबसाइट पर यह त्रुटि मिलती है, तो आपको wp-config db charset बदलने की आवश्यकता है:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

के बजाय:

define('DB_CHARSET', 'utf8mb4');

0

DBeaver (या अन्य संपादकों) में जो स्क्रिप्ट फ़ाइल आप काम कर रहे हैं, वह UTF8 के रूप में सहेजने के लिए संकेत दे सकती है और यह चार्ट को बदल देगी:

एक € "

में

–

या

–

-1

आपके पास Word डॉक्यूमेंट से कॉपी / पेस्ट टेक्स्ट होना चाहिए। Word दस्तावेज़ स्मार्ट उद्धरण का उपयोग करते हैं। आप इसे विशेष वर्ण (& rsquo;) से बदल सकते हैं या बस अपने HTML संपादक (') में टाइप कर सकते हैं।

मुझे यकीन है कि यह आपकी समस्या को हल करेगा।


-3

मेरे साथ भी यही हुआ - 'चरित्र' (लंबा ऋण चिह्न)।
मैंने इस सरल प्रतिस्थापन का उपयोग किया इसलिए इसे हल करें:

htmlText = htmlText.Replace('–', '-');

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