2009-09-19 6 views
6

मेरे पास एक विशाल MySQL तालिका है जिसमें इसकी पंक्तियां यूटीएफ -8 में दो बार एन्कोड की गई हैं। उदाहरण के लिए "Újratárgyalja" को "ššratrat¡rgyalja" के रूप में संग्रहीत किया जाता है।यूटीएफ -8 को एक स्ट्रिंग को डीकोड करने के लिए कैसे सरल यूटीएफ -8 में दो बार एन्कोड किया गया है?

MySQL .Net कनेक्टर उन्हें इस तरह डाउनलोड करता है। मैंने System.Text.Encoding.Convert() के साथ कई संयोजनों की कोशिश की लेकिन उनमें से कोई भी काम नहीं किया।

set names 'utf8' (या अन्य वर्णसेट) भेजना इसे हल नहीं करेगा।

मैं उन्हें डबल यूटीएफ -8 से यूटीएफ -8 में कैसे डीकोड कर सकता हूं?

+1

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

उत्तर

8

पिकुलियर समस्या, लेकिन मुझे लगता है कि मैं इसे यूटीएफ -8 और लैटिन -1 के उपयुक्त रूप से अपवित्र मिश्रण द्वारा पुन: उत्पन्न कर सकता हूं (हालांकि यूटीएफ -8 के केवल दो उपयोगों द्वारा लैटिन -1 में एक अंतरंग गलत कदम के बिना) । यहाँ पूरे अजीब राउंड ट्रिप (पायथन 2. * या IronPython दोनों इस पुन: पेश करने में सक्षम होना चाहिए) है, "वहाँ और फिर से वापस":

# -*- coding: utf-8 -*- 
uni = u'Újratárgyalja' 
enc1 = uni.encode('utf-8') 
enc2 = enc1.decode('latin-1').encode('utf-8') 
dec3 = enc2.decode('utf-8') 
dec4 = dec3.encode('latin-1').decode('utf-8') 

for x in (uni, enc1, enc2, dec3, dec4): 
    print repr(x), x 

यह दिलचस्प उत्पादन होता है ...:

u'\xdajrat\xe1rgyalja' Újratárgyalja 
'\xc3\x9ajrat\xc3\xa1rgyalja' Újratárgyalja 
'\xc3\x83\xc2\x9ajrat\xc3\x83\xc2\xa1rgyalja' Ãjratárgyalja 
u'\xc3\x9ajrat\xc3\xa1rgyalja' Ãjratárgyalja 
u'\xdajrat\xe1rgyalja' Újratárgyalja 

à से शुरू होने वाली अजीब स्ट्रिंग एन्क 2 के रूप में दिखाई देती है, यानी दो यूटीएफ -8 एन्कोडिंग मिश्रण में फेंकने वाले एक अंतरंग लैटिन -1 डिकोडिंग के साथ। और जैसा कि आप देख सकते हैं इसे ऑपरेशन के बिल्कुल-विपरीत अनुक्रम द्वारा पूर्ववत किया जा सकता है: utf-8 के रूप में डीकोड करें, लैटिन -1 के रूप में फिर से एन्कोड करें, फिर से utf-8 के रूप में फिर से डीकोड करें - और मूल स्ट्रिंग वापस है (yay !)।

मेरा मानना ​​है कि लैटिन -1 (उर्फ आईएसओ -885 9 -1) और यूटीएफ -8 दोनों की सामान्य राउंड-ट्रिप गुणों की गारंटी होनी चाहिए कि यह अनुक्रम काम करेगा (क्षमा करें, अभी सी # उस भाषा में कोशिश करने के लिए नहीं , लेकिन मैं उम्मीद करता हूं कि एन्कोडिंग/डिकोडिंग अनुक्रम उपयोग में विशिष्ट प्रोग्रामिंग भाषा पर निर्भर नहीं होना चाहिए)।

+0

इंजेनिअस। और जवाब स्वीकार किया जाता है। हालांकि, अपनी जिज्ञासा के लिए, मैंने विंडोज़ पर पाइथन 2.6.1 के साथ अपने परिणामों को पुन: पेश करने का प्रयास किया। इसका एक कठिन समय था, क्योंकि आपके कोड की प्रतिलिपि बनाने और चिपकाने के बहुत सारे कार्य किए गए मुद्दे (उदाहरण के लिए, नोटपैड में चिपकाना और आईडीईएल संपादक काफी अलग थे!)।फिर इसे निष्पादित करने से अधिक समस्याएं उत्पन्न हुईं (आईडीएलई के बाहर अगर केवल प्रिंटर (एक्स) प्रिंटिंग का सहारा लेना पड़ा)। [मुझे पता है, मुझे पता है, एक असली ऑपरेटिंग सिस्टम प्राप्त करें, आदि] –

-1

आप MySQL क्वेरी स्तर पर

SELECT CONVERT(`your_column` USING ascii) 
FROM `your_table` 

उपयोग करने का प्रयास कर सकता है। हालांकि, यह अंधेरे में एक झटका है।

1

जब आप लिखते हैं "MySQL .Net कनेक्टर उन्हें इस तरह से डाउनलोड करता है।" इसका एक अच्छा मौका है इसका अर्थ है MySQL .Net कनेक्टर का मानना ​​है कि यह माईएसQL में लैटिन -1 बोल रहा है, जबकि MySQL का मानना ​​है कि वार्तालाप यूटीएफ -8 में है। कॉलम को लैटिन -1 के रूप में घोषित करने का मौका भी है, लेकिन वास्तव में यूटीएफ -8 डेटा शामिल है।

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

किसी भी मामले में आपको अंतर्निहित समस्या को ठीक करने का प्रयास करना चाहिए, कम से कम नहीं, क्योंकि जो भी सिस्टम को अन्यथा बनाए रखना है, उसके लिए पूरी तरह से सिरदर्द होने जा रहा है।

+0

कॉलम को यूटीएफ -8 के रूप में घोषित किया गया है और इसमें संग्रहीत डेटा भी यूटीएफ -8 है, लेकिन कुछ रहस्यमय कारणों से PHP के पीडीओ एक्सटेंशन ने इसे दो बार एन्कोड किया। – RoliSoft

+0

आपने कभी PHP के बारे में कुछ भी नहीं बताया है। तो क्या डेटा वास्तव में MySQL डीबी में भ्रष्ट है? – tialaramex

+0

मैंने इसे पहले वाक्य में सही बताया है, यह इस तरह MySQL डेटाबेस में संग्रहीत है। हालांकि, मैंने उल्लेख नहीं किया कि PHP के पीडीओ एक्सटेंशन ने उन्हें इस तरह से संग्रहीत किया है, क्योंकि मूल प्रश्न यह था कि सी # में एक स्ट्रिंग को डीकोड कैसे किया जाए जो यूटीएफ -8 दो बार एन्कोड किया गया हो। – RoliSoft

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