2016-10-11 6 views
5

से गायब चरित्र मेरे डेटाबेस में NVARCHAR प्रकार कॉलम है। मैं इस कॉलम की सामग्री को मेरे कोड में सादा स्ट्रिंग में बदलने में असमर्थ हूं। (मैं डेटाबेस कनेक्शन के लिए pyodbc का उपयोग कर रहा हूं)।स्ट्रिंग एन्कोड/डीकोड समस्या - अंत

# This unicode string is returned by the database 
>>> my_string = u'\u4157\u4347\u6e65\u6574\u2d72\u3430\u3931\u3530\u3731\u3539\u3533\u3631\u3630\u3530\u3330\u322d\u3130\u3036\u3036\u3135\u3432\u3538\u2d37\u3134\u3039\u352d' 

# prints something in chineese 
>>> print my_string 
䅗䍇湥整⵲㐰㤱㔰㜱㔹㔳㘱㘰㔰㌰㈭㄰〶〶ㄵ㐲㔸ⴷㄴ〹㔭 

निकटतम मैं चले गए हैं utf-16 के लिए यह रूप में एन्कोडिंग के माध्यम से है:

>>> my_string.encode('utf-16') 
'\xff\xfeWAGCenter-04190517953516060503-20160605124857-4190-5' 
>>> print my_string.encode('utf-16') 
��WAGCenter-04190517953516060503-20160605124857-4190-5 

लेकिन वास्तविक मूल्य है कि मैं डेटाबेस में मूल्य की दुकान के अनुसार की जरूरत है:

WAGCenter-04190517953516060503-20160605124857-4190-51 

मैंने utf-8, utf-16, ascii, utf-32 पर एन्कोडिंग करने की कोशिश की लेकिन कुछ भी काम नहीं कर रहा था।

क्या किसी के पास इस बात का विचार है कि मुझे क्या याद आ रहा है? और my_string से वांछित परिणाम कैसे प्राप्त करें।

संपादित: यह utf-16-le में परिवर्तित करने पर, मैं शुरू से ही अवांछित पात्रों को दूर करने में सक्षम हूँ, लेकिन अभी भी एक चरित्र अंत से लापता है

>>> print t.encode('utf-16-le') 
WAGCenter-04190517953516060503-20160605124857-4190-5 

कुछ अन्य स्तंभों के लिए कोशिश कर रहा है, यह काम कर रहा है। इस अस्थायी मुद्दे का कारण क्या हो सकता है?

+0

आप शुरुआत में एक बाइट ऑर्डर मार्क (बीओएम) – brianpck

+0

@brianpck बाइट ऑर्डर मार्क देख रहे हैं + अंत में गायब 1। मैं अभी * बाइट ऑर्डर मार्क * के बारे में जांच कर रहा हूं। कोई विचार क्यों आखिरकार '1' गायब है? – user7001260

+1

'my_string' * में वर्ण * सीजेके कोड पॉइंट्स हैं, जो वास्तव में 'nvarchar' फ़ील्ड से वास्तव में वापस आने की संभावना नहीं है? यदि संभव हो तो इसे हमेशा 'वर्चर' के रूप में एक कलाकार 'चयन कास्ट (क्षेत्र के रूप में क्षेत्र (xxx)) के साथ पढ़ा जा सकता है ... ' –

उत्तर

2

आपके डेटाबेस परिभाषा में आपको एक बड़ी समस्या है, जिस तरह से आप इसमें मूल्य संग्रहीत करते हैं, या जिस तरह से आप इससे मूल्य पढ़ते हैं। मैं केवल व्याख्या कर सकते हैं आप क्या देख रहे हैं, लेकिन न तो क्यों है और न ही बिना इसे ठीक करने के लिए कैसे:

  • डेटाबेस
  • रास्ता के प्रकार आप इसे में इनपुट मानों
  • जिस तरह से आप मान एक्सट्रैक्ट प्राप्त करने के लिए अपने छद्म यूनिकोड स्ट्रिंग
  • वास्तविक सामग्री यदि आप प्रत्यक्ष (देशी) डेटाबेस का उपयोग का उपयोग

Wh आप पर एक ASCII स्ट्रिंग है, जहां 8 बिट्स वर्णों को जोड़ी द्वारा समूहित किया जाता है ताकि छोटे एंडियन क्रम में 16 बिट यूनिकोड वर्ण बनाए जा सकें। चूंकि अपेक्षित स्ट्रिंग में वर्णों की एक विषम संख्या होती है, इसलिए अंतिम वर्ण अनुवाद में खो गया था (मूल रूप से) u'\352d' के साथ समाप्त होता है, जहां 0x2d '-' और 0x35 '5' के लिए ASCII कोड है। डेमो:

def cvt(ustring): 
    l = [] 
    for uc in ustring: 
     l.append(chr(ord(uc) & 0xFF)) # low order byte 
     l.append(chr((ord(uc) >> 8) & 0xFF)) # high order byte 
    return ''.join(l) 

cvt(my_string) 
'WAGCenter-04190517953516060503-20160605124857-4190-5' 
+0

से एक वर्ण गुम है, मैं मानता हूं कि यह सवाल का जवाब नहीं देता है, लेकिन यह दी गई जानकारी के साथ मैं सबसे अच्छा कर सकता हूं, और यह –

+0

टिप्पणी के लिए बहुत विस्तृत है डेटाबेस इंजन के रूप में 'Netezza'। और मैं इसे 'ascii' में एन्कोड करने में असमर्थ हूं। मैंने 'utf-16' के लिए अपना 'pyodbc' कॉन्फ़िगर किया है। मुझे बताएं कि आपको कौन से अतिरिक्त विवरण चाहिए? स्पष्टीकरण के लिए धन्यवाद। मुझे पता है कि कुछ गड़बड़ है, लेकिन मुझे नहीं पता कि कहां जांचना है। साथ ही, मैं जिस डेटाबेस का उपयोग कर रहा हूं वह अलग-अलग टीम से संबंधित है, मैं केवल अपने प्रोजेक्ट स्तर पर कॉन्फ़िगरेशन बदल सकता हूं। – user7001260

+0

@ user7001260: क्या आप लैटिन 1 एन्कोडिंग के लिए pyodbc को कॉन्फ़िगर कर सकते हैं? लैटिन 1 में यूनिकोड के 256 पहले कोड शामिल हैं। –

1

मुद्दा था, मैं UTF-16 मेरी odbcinst.ini फ़ाइल जहां के रूप में मैं वर्ण एन्कोडिंग का UTF-8 प्रारूप का इस्तेमाल किया था में उपयोग कर रहा था।

इससे पहले मैं से कनेक्शन बनाते समय इसे OPTION पैरामीटर के रूप में बदल रहा था। लेकिन बाद में इसे odbcinst.ini फ़ाइल में बदलकर इस मुद्दे को ठीक किया गया।

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