2009-05-27 8 views
10

मुझे एक समस्या है जहां मैं यूसीएस-2 के रूप में SQL सर्वर में एक यूटीएफ -8 स्ट्रिंग संग्रहीत कर रहा हूं। जब मैं इसे एक पृष्ठ पर प्रदर्शित करने के लिए खींचता हूं जिसमें सामग्री-प्रकार सेट यूटीएफ -8 पर सेट होता है तो यह ठीक काम करता है। लेकिन मेरे पास एक तृतीय पक्ष जावास्क्रिप्ट घटक है जो जब मैं इसे डेटाबेस के लिए स्ट्रिंग पास करता हूं तो यह इसे यूएससी 2 के रूप में प्रस्तुत करता है। या यूटीएफ 8 नहीं।क्लासिक एएसपी - यूटीएफ -8 स्ट्रिंग को यूसीएस -2 में कैसे परिवर्तित करें?

क्या एएसपी में इस स्ट्रिंग को यूटीएफ -8 में परिवर्तित करने के लिए डेटाबेस से इसे तीसरे पक्ष के घटक (obfuscated) में पास करने के बाद परिवर्तित करने का कोई तरीका है?

आशा है कि यह समझ में आता है।

उत्तर

-4

एन्कोडिंग .UTF8 और एन्कोडिंग। यूनिकोड पर्याप्त कार्यक्षमता प्रदान करेगा। अधिक जानकारी के लिए देखें Wikipedia

+5

-1 यह क्लासिक एएसपी है, एएसपी.NET नहीं। –

40

मेरा संदेह यह है कि आप क्लासिक फॉर्म पोस्ट कैरेक्टर एन्कोडिंग मिस्चैच समस्या का असफल हो रहे हैं।

यह इस प्रकार है: -

  • आप एक रूप है जिसमें ग्राहक UTF-8 एन्कोडिंग का उपयोग कर के लिए प्रस्तुत किया गया है।
  • नतीजतन ब्राउज़र यूटीएफ -8 एन्कोडिंग का उपयोग कर फ़ॉर्म में दर्ज टेक्स्ट मान पोस्ट करता है।
  • पोस्ट प्राप्त करने वाले एक्शन पेज में इसका उत्तरदायित्व कोड कोड 1252.
  • पोस्ट किए गए यूटीएफ -8 स्ट्रिंग के प्रत्येक बाइट को यूटीएफ के डीकोडिंग सेट के बजाय सर्वर द्वारा व्यक्तिगत चरित्र के रूप में माना जाता है। -8 एन्कोडेड बाइट्स को सही यूनिकोड वर्ण में।
  • स्ट्रिंग अब दूषित वर्णों के साथ डीबी में संग्रहीत है।
  • एक पृष्ठ क्लाइंट को भ्रष्ट वर्ण वाले डीबी फ़ील्ड की सामग्री प्रस्तुत करना चाहता है।
  • पेज सेट यह UTF-8 में चारसेट लेकिन इसकी Response.CodePage OEM कोड पृष्ठ पर इस तरह के रूप 1252.
  • Response.Write ग्राहक के लिए क्षेत्र सामग्री भेजने के लिए प्रयोग किया जाता है पर बनी हुई है, यूनिकोड वर्ण वापस करने के लिए बदल रहे हैं बाइट सेट के लिए बाइट ईलीयर पोस्ट में प्राप्त किया गया था।
  • ग्राहक सोचता है कि यह यूटीएफ -8 प्राप्त कर रहा है, इसलिए यह यूटीएफ -8 के रूप में सर्वर से प्राप्त पात्रों को डीकोड करता है, क्योंकि मूल रूप से वे स्क्रीन पर सही ढंग से दिखाई देते हैं।
  • सबकुछ ठीक से बढ़ता है जैसे कि सभी ठीक है, जबकि इन वर्णों को एएसपी के माध्यम से आगे और पीछे बाउंस किया जा रहा है। एक पृष्ठ में एक बग में एक मिलान करने वाली बग है (एक ही पृष्ठ हो सकता है) जो सब कुछ ठीक दिखता है।

यदि आप सीधे SQL सर्वर टूल्स के साथ फ़ील्ड सामग्री की जांच करते हैं तो आपको वहां दूषित तार दिखाई देंगे। अब जब आप इस स्ट्रिंग को किसी अन्य घटक के साथ उपयोग करना चाहते हैं जो सीधे-आगे यूनिकोड स्ट्रिंग की अपेक्षा कर रहा है, तो यह वह जगह है जहां आप यह बग खोजते हैं।

समाधान हमेशा यह सुनिश्चित करना है कि आपके सभी पृष्ठ न केवल प्रतिक्रिया में CharSet = "UTF-8" भेजें बल्कि Response.Write का उपयोग करने से पहले Response.CodePage = 65001 का उपयोग करें और किसी भी Request.Form मानों को पढ़ने का प्रयास करने से पहले। <% @ पृष्ठ शीर्षलेख में कोडपेज निर्देश का उपयोग करें।

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

एडीओडीबी का उपयोग करें।स्ट्रीम: -

Function ConvertFromUTF8(sIn) 

    Dim oIn: Set oIn = CreateObject("ADODB.Stream") 

    oIn.Open 
    oIn.CharSet = "WIndows-1252" 
    oIn.WriteText sIn 
    oIn.Position = 0 
    oIn.CharSet = "UTF-8" 
    ConvertFromUTF8 = oIn.ReadText 
    oIn.Close 

End Function 

इस समारोह (जो BTW अपने वास्तविक सवाल का जवाब है) एक भ्रष्ट स्ट्रिंग और स्ट्रिंग यह किया जाना चाहिए था में धर्मान्तरित (बाइट प्रतिनिधित्व की बाइट है कि एक) लेता है। आपको इस परिवर्तन को डीबी में हर क्षेत्र में लागू करने की आवश्यकता है जो बग का शिकार हो गया है।

+0

तीन साल बाद ... कमाल का जवाब! मुझे पता था कि मैं क्लासिक फॉर्म पोस्ट कैरेक्टर एन्कोडिंग मिस्चैच समस्या के बारे में सोच रहा था ", लेकिन मुझे नहीं पता था कि यह कहां हो रहा था। अगर मैं इसे स्वीकार किए गए उत्तर के लिए मजबूर कर सकता हूं, तो मैं चाहता हूं। – Brendan

+0

धन्यवाद मेरे मामले में बहुत अच्छा, सही समाधान –

+2

यह ध्यान दिया जाना चाहिए कि 'ConvertFromUTF8()' फ़ंक्शन का उपयोग ** केवल ** दूषित डेटा को सही करने के लिए उपयोग किया जाना चाहिए। डेवलपर को अभी भी यह सुनिश्चित करना चाहिए कि वे सही एन्कोडिंग का उपयोग करने के लिए साइट को सही करें और पहले स्थान पर एन्कोडिंग विसंगति से बचें। – Lankymart

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