2010-09-30 9 views
8

मेरे पास कई वेबसाइटें हैं जो अमान्य वर्ण प्रस्तुत कर रही हैं। पेज 'मेटा टैग यूटीएफ -8 एन्कोडिंग निर्दिष्ट करते हैं। हालांकि, कई पृष्ठों में वे वर्ण होते हैं जिन्हें यूटीएफ -8 द्वारा व्याख्या नहीं किया जा सकता है, संभवतः फाइलों को अन्य एन्कोडिंग (जैसे एएनएसआई) के साथ सहेजा गया था। विशेष रूप से मैं इस बारे में चिंतित हूं कि अभी एक फैंसी एस्ट्रोफ़े है (जैसा कि "बॉब के" में खेद है ... क्षमा करें अगर यह सही तरीके से दिखाई नहीं दे रहा है)। डब्ल्यू 3 का वैलिडेटर इंगित करता है कि इकाई "\ x92" है, लेकिन यह फ़ाइल को मान्य नहीं करेगी क्योंकि यह यूनिकोड पर मैप नहीं करती है। और, ज़ाहिर है, अगर मैं नोटपैड ++ में फ़ाइल खोलता हूं और एन्कोडिंग को यूटीएफ -8 में बदलता हूं, तो चरित्र को ब्लैक बॉक्स में 92 द्वारा प्रतिस्थापित किया जाता है।मैं अलग-अलग एन्कोडिंग वाले पृष्ठों में अमान्य HTML वर्ण कैसे ठीक करूं?

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

उत्तर

2

आप सीधे HTML के रूप में पृष्ठों का प्रदर्शन कर रहे हैं, या आप एक और अनुसूचित जाति की क्या ज़रूरत है रिप्ट सामग्री की सेवा? यदि आपके पास ऐसी सामग्री है जो सामग्री की सेवा कर रही है, तो वह स्क्रिप्ट सिर्फ \ x92 के किसी भी उदाहरण की तलाश कर सकती है और इसे एस्ट्रोफ़े के साथ प्रतिस्थापित कर सकती है। PHP में यह एक साधारण str_replace होगा()

यदि आप सीधे HTML की सेवा कर रहे हैं तो आपको वास्तव में फ़ाइलों को स्वयं संशोधित करना होगा। यह स्वचालित हो सकता है, हालांकि (यदि संभवतः आपके पास कौन से टूल्स उपलब्ध हैं और आप किस ऑपरेटिंग सिस्टम में हैं, इस पर निर्भर करता है कि आप सैकड़ों फाइलें हैं)। चूंकि आपने कहा था कि आप नोटपैड ++ का उपयोग कर रहे हैं, मुझे लगता है कि यह मानना ​​सुरक्षित है आप एमएस विंडोज़ में हैं (इसलिए चीजों को गति देने के लिए कोई मजेदार यूनिक्स कमांड नहीं)

हालांकि बैच स्क्रिप्ट बनाना संभव हो सकता है जो यह कर सकता है। कमांड प्रॉम्प्ट में निर्मित बहुत सरल ASCII टेक्स्ट संपादन टूल हैं। यदि यह संभव नहीं है तो सी या सी ++ प्रोग्राम ऐसा करने के लिए बहुत संभव है यदि आपके पास आपके सिस्टम पर एक कंपाइलर है और सी के मध्यम ज्ञान है। यदि आपके पास पूर्व है और बाद वाला नहीं है, तो पूछें और मैं कुछ चाबुक करूंगा आपके लिए स्रोत

+0

हां, यह एक विंडोज वातावरण है। दुर्भाग्यवश, उनमें से अधिकांश एएसपी पृष्ठों में स्थिर HTML हैं। मैं देखूंगा कि यह एक संभावना है या नहीं। – Andy

1

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

गुड लक

+0

अच्छा विचार। पेज स्वयं वर्तमान में स्रोत नियंत्रण में हैं (लाइव सर्वर पर होने के अलावा), लेकिन एक प्रोग्राम या स्क्रिप्ट जो इस फिक्स को स्वचालित करती है वह सबसे आसान समाधान हो सकती है। – Andy

0

सभी विशेष वर्णों एचटीएमएल एन्कोड किया जाना चाहिए, उदा

http://www.w3schools.com/HTML/html_entities.asp

आप कैसे लागू यह काफी हद तक है कि कैसे आप पहली जगह में कोड पैदा कर रहे पर निर्भर करता है के रूप में, लेकिन एक कॉपीराइट प्रतीक

© 

HTML इकाई सूची के रूप में अपने HTML में होना चाहिए ASP.Net की तरह कुछ की तरह सर्वर साइड कार्यों होगा:

Server.HTMLEncode("string with special chars") 
+0

मुझे पता है कि उन्हें होना चाहिए, लेकिन वे नहीं हैं। मुझे कुछ मौजूदा सामग्री के लिए इसे ठीक करने की ज़रूरत है। – Andy

1

मैं बस इसी तरह की समस्या में भाग गया जहां कुछ तोड़ने वाले स्थान "xA0" को अनुमानित रूप से यूटीएफ -8 दस्तावेज़ में नहीं मिला। नोटपैड ++ में इन्हें "xA0" वाले काले बॉक्स में प्रदर्शित किया गया है। हालांकि नोटपैड ++ उन्हें कॉपी या पेस्ट करने की अनुमति नहीं देता है।

मैंने थोड़ा सा शोध किया और पता चला कि क्या हो रहा है। एक हेक्स संपादक से पता चलता है कि इन्हें एक बाइट के रूप में एन्कोड किया जा रहा है: "ए0" जो अवैध यूटीएफ -8 है। एएससीआईआई को कम से कम दो बाइट्स नहीं होना चाहिए, इसलिए उचित एन्कोडिंग हेक्साडेसिमल में "सी 2 ए 0" है।

आपके फैंसी एस्ट्रोफ़े उदाहरण के लिए, आप एक ही चीज़ से निपट रहे हैं। दरअसल, आपकी समस्या अधिक जटिल है क्योंकि विस्तारित एसीआई चरित्र \ x92 (दशमलव 146) में एक एस्ट्रोफ़े है लेकिन यूनिकोड \ x92 में एक नियंत्रण चरित्र है और सही एकल उद्धरण यू + 201 9 (दशमलव 8217) होना चाहिए। (संपादित के माध्यम से> चरित्र पैनल) ++ नोटपैड में इस प्रतीक जोड़ना और एक हेक्स संपादक में निरीक्षण पता चलता है कि उचित हेक्साडेसिमल एन्कोडिंग "E2 80 99" जो बाइनरी में 1110 है। जब आप यूटीएफ -8 नियंत्रण बाइट्स (गैर बोल्ड) को हटाते हैं तो यह 0010 0000 0000 0001 1001 उत्पन्न करता है जो 8217 के दशमलव मान के बराबर होता है।

इसे संभालने का उचित तरीका आपकी फ़ाइल को बाइट स्ट्रीम के रूप में खोलना होगा (सी में हस्ताक्षर किए गए char *) और अनुचित यूटीएफ -8 अनुक्रमों की खोज करें। फिर आप उन्हें (https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences देखें) के साथ प्रतिस्थापित कर सकते हैं या आप A0 -> C2 A0 (अनुचित रूप से एन्कोडेड गैर ब्रेकिंग स्पेस) और 92 -> E2 80 99 (प्रतिलिपि में सही एकल उद्धरण को एन्कोड किए गए) को प्रतिस्थापित करके कस्टम हैंडल करने का प्रयास कर सकते हैं। निशान)।

संबंधित मुद्दे