HTML एन्कोडिंग समस्याएं - "& nbsp;" के बजाय "up" वर्ण दिखा रहा है


203

मुझे एक विरासत ऐप मिल गया है जो सिर्फ दुर्व्यवहार करना शुरू कर रहा है, जो भी कारण मुझे यकीन नहीं है। यह HTML का एक गुच्छा बनाता है जो ActivePDF द्वारा PDF रिपोर्ट में बदल जाता है।

प्रक्रिया इस तरह काम करती है:

  1. एक DB से टोकन के साथ एक HTML टेम्पलेट खींचें जिसमें इसे प्रतिस्थापित किया जा सके (जैसे "~ CompanyName ~", "~ CustomerName ~", आदि)
  2. टोकन को वास्तविक डेटा से बदलें
  3. HTML को एक साधारण रेगेक्स फ़ंक्शन के साथ व्यवस्थित करें जो कि संपत्ति टैग HTML टैग विशेषता मान (उद्धरण चिह्नों आदि को सुनिश्चित करता है, क्योंकि ActivePDF का रेंडरिंग इंजन कुछ भी नफरत करता है, लेकिन विशेषता मानों के आसपास एकल उद्धरण)
  4. पीडीएफ बनाने वाली वेब सेवा को HTML भेजें।

उस गड़बड़ में कहीं, HTML टेम्प्लेट (  एस) से गैर-ब्रेकिंग रिक्त स्थान को आईएसओ-8859-1 के रूप में एन्कोडिंग किया जाता है ताकि वे ब्राउज़र (फ़ायरफ़ॉक्स) में दस्तावेज़ को देखते समय गलत तरीके से "Â" चरित्र के रूप में दिखाई दें। ActivePDF इन गैर-UTF8 वर्णों पर ध्यान केंद्रित करता है।

मेरा प्रश्न: क्योंकि मुझे नहीं पता कि समस्या कहाँ से उपजी है और इसकी जांच करने का समय नहीं है, तो क्या खराब पात्रों को फिर से एनकोड या खोजने और बदलने का एक आसान तरीका है? मैंने इसे इस छोटे से समारोह के माध्यम से भेजने की कोशिश की है जिसे मैंने एक साथ फेंक दिया है, लेकिन यह सब बदल जाता है gobbledegook में कुछ भी नहीं बदलता है।

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

कोई विचार?

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

मैं इसके साथ अभी के लिए मिल रहा हूँ, हालांकि यह शायद ही एक अच्छा समाधान की तरह लगता है:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

2
क्या HTML में अपने वर्ण सेट का वर्णन करने के लिए कोई मेटा इंफॉर्मेटोन है?
रोलैंड शॉ

1
[पिछली टिप्पणी हटा दी गई] लघु ​​उत्तर: नहीं।
19

1
मेरे लिए काम किया: utf8_decode ()
ursuleacv

जवाबों:


340

उस गड़बड़ में कहीं, HTML टेम्प्लेट (एस) से गैर-ब्रेकिंग रिक्त स्थान को आईएसओ-8859-1 के रूप में एन्कोडिंग किया जाता है ताकि वे गलत तरीके से "that" चरित्र के रूप में दिखाई दें

यह UTF-8 के लिए एन्कोडिंग होगा, ISO-8859-1 नहीं। नॉन-ब्रेकिंग स्पेस कैरेक्टर ISO-8859-1 में बाइट 0xA0 है; जब यूटीएफ -8 में एन्कोड किया गया तो यह 0xC2,0xA0 होगा, जो, यदि आप (गलत तरीके से) इसे आईएसओ-8859-1 के रूप में देखते हैं " "। इसमें एक अनुगामी nbsp शामिल है जिसे आप देख नहीं सकते हैं; यदि वह बाइट नहीं है, तो कुछ और ने आपके दस्तावेज़ को रद्द कर दिया है और हमें यह जानने के लिए आगे देखने की आवश्यकता है कि क्या है।

क्या regexp है, कैसे काम करता है? यदि कहीं आपके  तार सही (U) 00A0 NON-BREAKING SPACE वर्ण में बदल रहे हैं तो एक उचित HTML पार्सर शामिल प्रतीत होगा । यदि ऐसा है, तो आप अपने टेम्पलेट को मूल रूप से DOM में संसाधित कर सकते हैं, और इसे गैर-ASCII वर्णों को चरित्र संदर्भ के रूप में रखने के लिए ASCII एन्कोडिंग का उपयोग करके क्रमबद्ध करने के लिए कह सकते हैं। यह भी आप HTML पर ही regex के बाद प्रसंस्करण करना बंद कर देंगे, जो कि हमेशा एक अत्यधिक कामचोर व्यवसाय है।

वैसे भी, अब के लिए आप अपने दस्तावेज़ में निम्नलिखित में से एक जोड़ सकते हैं <head>और देख सकते हैं कि क्या यह ब्राउज़र में सही दिखता है:

  • HTML4 के लिए: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • HTML5 के लिए: <meta charset="utf-8">

यदि आपने ऐसा कर लिया है, तो शेष समस्या ActivePDF की गलती है।


20
मैं <meta charset="utf-8">अभी तक सिफारिश नहीं करेंगे। http-equivसंस्करण एचटीएमएल 5 में अभी भी मान्य है और बेहतर समर्थित है।
बोबिन्स



यह सभी आधुनिक ब्राउज़रों में काम करता है। यह निश्चित रूप से सभी विरासत और आला (जैसे मोबाइल) ब्राउज़रों या सभी मकड़ियों पर काम नहीं करता है।
बॉबसन

3
"कहीं वो गड़बड़" ... LOL! अच्छा खुला! अच्छा उत्तर! +1
प्रतिरोध डिजाइन

24

अगर किसी को भी मेरे जैसी ही समस्या थी और पहले से ही समस्या ठीक थी, तो बस यही करें:

  1. .Html फ़ाइल के अंदर सभी कोड कॉपी करें।
  2. नोटपैड (या कोई मूल पाठ संपादक) खोलें और कोड पेस्ट करें।
  3. "फ़ाइल -> इस रूप में सहेजें" पर जाएं
  4. आप फ़ाइल नाम "example.html" दर्ज करें ("इस प्रकार सहेजें: सभी फ़ाइलें ( ? )" चुनें)
  5. UTF-8 के रूप में एनकोडिंग का चयन करें
  6. सहेजें को मारो और अब आप अपनी पुरानी .html फ़ाइल को हटा सकते हैं और एन्कोडिंग को ठीक किया जाना चाहिए

2
इसने मेरे लिए यह किया। अब उदात्त में इसके UTF-8 with BOMबजाय कहते हैं UTF-8। उदात्त पाठ में यह देखने के लिए, आपको सेटिंग्स - उपयोगकर्ता में show_encodingसेट करना होगा true
J86

मुझे समस्या थी कि of के बजाय had दिखा रहा था, amd जब इस समाधान का उपयोग करके समस्या हल हो गई, लेकिन एक php चेतावनी है: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

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

धन्यवाद! इसने चाल चली। मैं फ़ाइल में अनुरोध / प्रतिक्रिया देखता हूं (मेरे मामले में, ASPX) को UTF-8 के रूप में एन्कोड किया गया था। नोटपैड ++ ने इसे UTF-8 में भी एन्कोड किया था। क्या बिल्ली, ठीक है? लेकिन आप समाधान कर रहे हैं चाल है। मेरे लिए, यह एक स्पेनिश वाक्यांश था जो पृष्ठ पर ठीक से एन्कोडिंग नहीं था। मैंने स्पैनिश के लिए UTF-8 BOM का उपयोग न करने के लिए कहीं और पढ़ा है लेकिन इसने मेरे लिए इसे ठीक कर दिया है।
user3621633

13

समस्या: यहां तक ​​कि मैं उस समस्या का सामना कर रहा था, जहां हम CRM सिस्टम के लिए POST अनुरोध में कुछ स्ट्रिंग के साथ '£' भेज रहे थे , लेकिन जब हम CRM से GET कॉल कर रहे थे, तो यह कुछ स्ट्रिंग सामग्री के साथ '£' लौटा रहा था । तो क्या हम विश्लेषण किया है वह यह है कि '£' में बदला मिल रही थी, 'एक £'

विश्लेषण: शोध के बाद हमें जो गड़बड़ मिली है, वह यह है कि POST कॉल में हमने HttpWebRequest ContentType को "text / xml" के रूप में सेट किया है जबकि GET कॉल में यह "text / xml; charset: utf-8" था

समाधान: इसलिए समाधान के हिस्से के रूप में हमने चारसेट को शामिल किया है : POST अनुरोध में utf-8 और यह काम करता है।


0

मेरे मामले में यह (एक कैरेट के साथ) कोड में उत्पन्न हुआ जो मैंने दृश्य स्टूडियो से कोड उत्पन्न करने के लिए अपने उपकरण का उपयोग करके उत्पन्न किया था। इसे हल करना आसान था:

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

PS: जब आप कर्सर को एक पर रखते हैं या आप इसे VS2017 + में चुनते हैं तो सभी समान वर्णों को देखना आसान होता है; मुझे उम्मीद है कि अन्य आईडीई में भी इसी तरह की विशेषताएं हो सकती हैं


-1

मेरे मामले में मैं nbsp के बजाय लैटिन क्रॉस साइन कर रहा था, यहां तक ​​कि एक पृष्ठ को सही ढंग से UTF-8 में एन्कोड किया गया था। ऊपर के कुछ भी मुद्दे को हल करने में मदद नहीं की और मैंने सभी की कोशिश की।

IE के लिए अंतिम बदलते फ़ॉन्ट (ब्राउज़र विशिष्ट सीएसएस के साथ) में मदद मिली, मैं हेल्वेटिका-न्यू का उपयोग कर रहा था क्योंकि एरियल को बदलने वाले बॉडी फ़ॉन्ट ने समस्या को हल कर दिया।


फॉन्ट को स्विच करने में मदद करने का कारण हो सकता है क्योंकि फोंट में से एक में चरित्र का प्रश्न नहीं होता है, इसलिए आपने जो देखा वह इसके बजाय एक खाली चरित्र था। लेकिन इससे समस्या हल नहीं हुई, इसने इसे कवर किया।
ओलिवर हॉसलर

-2

मुझे एक ही तरह की समस्या हो रही थी। जाहिरा तौर पर यह सिर्फ इसलिए है क्योंकि PHP utf-8 को नहीं पहचानता है।

मैं पहली बार अपने बालों को फाड़ रहा था, जब एक '£' संकेत 'ing £' के रूप में दिखा रहा था, इसके बावजूद कि यह DreamWeaver में ठीक दिखाई दे रहा था। आखिरकार मुझे याद आया कि मुझे अनुक्रमणिका फ़ाइल के सापेक्ष लिंक में समस्याएँ हो रही थीं, जब पृष्ठ, अगर सीधे देखे तो स्लाइडशो के साथ काम करेंगे, लेकिन तब नहीं जब एक शामिल के साथ प्रयोग किया जाता है (लेकिन यह बिंदु के पास है। वैसे भी मुझे आश्चर्य है कि क्या यह हो सकता है। इसी तरह की समस्या है, इसलिए उस पेज में डालने के बजाय जिसके साथ मुझे समस्या हो रही थी, मैंने बस इसे index.php फ़ाइल में डाल दिया - समस्या पूरी तरह से ठीक हो गई।


-2

इसका कारण यह है PHP utf-8 को नहीं पहचानता है।

यहां आप इसे HTML में सभी विशेष वर्णों के लिए जांच सकते हैं

http://www.degraeve.com/reference/specialcharacters.php


1
यह PHP के बारे में एक सवाल नहीं था, यह VB.NET है।
13

मैं नहीं, लेकिन आप समस्या को हल करने के लिए इन पात्रों का उपयोग कर सकते हैं। इससे मेरा समाधान तय हुआ।
al123

-2

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

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