2008-09-26 19 views
11

में कनवर्ट करने के लिए कैसे करें समस्या:यूनिकोड वर्ण को उसके ASCII समकक्ष

सी # में मुझे विरासत एक्सेस डेटाबेस से जानकारी मिल रही है। .NET मुझे सामग्री को सौंपने से पहले डेटाबेस की सामग्री (इस समस्या के मामले में एक स्ट्रिंग) को यूनिकोड में परिवर्तित करता है।

मैं इस यूनिकोड स्ट्रिंग को इसके ASCII समकक्ष में कैसे परिवर्तित करूं?


संपादित
यूनिकोड वर्ण 710 वास्तव में संशोधक पत्र स्वरित लहजे है।

string myInput = Convert.ToString(Convert.ToChar(710)); 
byte[] asBytes = Encoding.ASCII.GetBytes(myInput); 

लेकिन यह भी नहीं होती:

 -> (Extended) ASCII character ê (Extended ASCII 136) was inserted in the database. 
-> Either Access or the reading component in .NET converted this to U+02C6 U+0065 
    (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER E) 
-> I need the (Extended) ASCII character 136 back. 


यहाँ मैं (मैं अब देखना यह क्यों काम नहीं किया ...) क्या कोशिश की है है: यहाँ समस्या थोड़ा और अधिक सटीक है 94 लेकिन मूल्य 63 ...
यहाँ एक नया प्रयास है, लेकिन यह अभी भी काम नहीं करता है के साथ एक बाइट:

byte[] bytes = Encoding.ASCII.GetBytes("ê"); 


Soltution
सही दिशा में इशारा करते हुए के लिए दोनों csgero और bzlm के लिए धन्यवाद मैं इस समस्या here हल किया।

+1

अवधि "विस्तारित ASCII" भ्रामक है। यदि आपका इनपुट डेटा वास्तव में ASCII है, तो कोई ë या "वर्ण संख्या 136" नहीं है। यह अधिक संभावना है कि आपके डेटा में एएससीआईआई द्वारा वर्णित वर्ण शामिल नहीं हैं, जैसे कि विंडोज -1252 जैसे विरासत 8-बिट एन्कोडिंग द्वारा प्रतिनिधित्व किए जाने वाले अंतरराष्ट्रीय डेटा। – bzlm

+0

मुझे पता है, इस विषय के बारे में एक संपूर्ण विकिपीडिया लेख है। – Huppie

+0

आपको समाधान को उत्तर के रूप में पोस्ट करना चाहिए, न कि प्रश्न में, इसलिए हम इसके लिए मतदान कर सकते हैं। –

उत्तर

9

ठीक है, चलिए विस्तृत करें। csgero और bzlm दोनों सही दिशा में इंगित किया गया।

blzm के उत्तर की वजह से मैं विकि पर विंडोज़ -1252 पेज देखा और पाया कि यह एक कोड पृष्ठ पर कहा जाता है। Code page के लिए विकिपीडिया लेख जो निम्नलिखित ने कहा:

कोई औपचारिक मानक इन 'extended character sets' अस्तित्व में थी; आईबीएम ने केवल वेरिएंट को कोड पेज के रूप में संदर्भित किया है, क्योंकि यह हमेशा ईबीसीडीआईसी एन्कोडिंग के रूपों के लिए किया गया था।

यह 437 कोड पृष्ठ पर करने के लिए मेरे नेतृत्व में:

n ASCII-संगत कोड पृष्ठों, कम 128 वर्ण उनके मानक US-ASCII मूल्यों, और विभिन्न पृष्ठों (या अक्षरों के सेट) बनाया जा सकता है बनाए रखा ऊपरी 128 वर्णों में उपलब्ध है। उत्तरी अमेरिकी बाजार के लिए बनाया गया डॉस कंप्यूटर, उदाहरण के लिए, code page 437 का उपयोग किया गया, जिसमें फ्रांसीसी, जर्मन और कुछ अन्य यूरोपीय भाषाओं के साथ-साथ कुछ ग्राफिकल लाइन-ड्राइंग पात्रों के लिए आवश्यक उच्चारण वर्ण शामिल थे।

तो, कोडपेज 437 कोड कोड था जिसे मैं 'विस्तारित ASCII' कह रहा था, यह चरित्र 136 के रूप में था इसलिए मैंने कुछ अन्य वर्णों को भी देखा और वे सही लग रहे थे।

csgero Encoding.GetEncoding() संकेत के साथ आया था, मैं इसे इस्तेमाल किया निम्नलिखित बयान जो मेरी समस्या हल करती है बनाने के लिए:

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê"); 
+3

देखें यूनिकोड सामान्यीकरण विषय, तुल्यता की विशेष रूप से दो रूपों: विहित और अनुकूलता - http://en.wikipedia.org/wiki/Unicode_normalization एक .NET स्ट्रिंग उदाहरण पर, मानक के अनुसार विधि कॉल या तो NormalizationForm.FormD या NormalizationForm गुजर। फॉर्मकेडी, जो कैननिकल और कॉम्पेबिलिटी ** के अनुरूप ** रूपों से मेल खाती है। उदाहरण के लिए, इसे "êwś" जैसी स्ट्रिंग पर कॉल करना, "e^ws" स्ट्रिंग का उत्पादन करेगा। आप रिवर्स भी कर सकते हैं, "ई ^" जैसे स्ट्रिंग को "ê" में सामान्यीकृत (NormalizationForm.FormC) या सामान्यीकृत (NormalizationForm.FormKC) को कॉल करके परिवर्तित कर सकते हैं। – Triynko

0

हम्म ... मुझे यकीन नहीं है कि आपका कौन सा चरित्र है। देखभाल ("^", सर्कफ्लेक्स एक्सेन्ट) के पास ASCII और यूनिकोड (यू +005 ई) में एक ही कोड है।

/संपादित करें: अरे, मेरी गलती। 710 (यू + 02 सी 6) वास्तव में मॉडिफायर लिटर सर्कफ्लेक्स एक्सेसेंट है। दुर्भाग्यवश, यह चरित्र एएससीआईआई का हिस्सा नहीं है। यह सामान्य देखभाल की तरह दिख सकता है लेकिन यह एक अलग चरित्र है। सरल रूपांतरण यहां मदद नहीं करेगा। मुझे यकीन नहीं है कि क्या .NET यूनिकोड से कनवर्ट करते समय समान वर्णों के मैपिंग का समर्थन करता है। हालांकि, जांच की कीमत।

+0

मैंने ओपी का अर्थ क्या प्रतिबिंबित करने के लिए पोस्ट को संपादित किया है। :-) –

+0

यूनिकोड! = यूटीएफ -8 –

+0

ओजे: यूटीएफ -8 के साथ क्या करना है? –

0

मूल्य 63 प्रश्न चिह्न है, AKA "मैं इस चरित्र को ASCII में प्रदर्शित करने में सक्षम नहीं हूं"।

+0

तो, आप मेरी समस्या को इंगित कर रहे हैं। सवाल यह है कि मैं यह कैसे करता हूं, मुझे पता है कि जिस विधि को मैंने कोशिश की है वह काम नहीं करता है। – Huppie

3

आप यहां डिफ़ॉल्ट ASCII एन्कोडिंग (एन्कोडिंग.एएससीआईआईआईआई) का उपयोग नहीं कर सकते हैं, लेकिन एन्कोडिंग.गेटइन्कोडिंग (...) का उपयोग कर उपयुक्त कोड पेज के साथ एन्कोडिंग बनाना होगा। आप कोड पेज 1252 का उपयोग करने का प्रयास कर सकते हैं, जो आईएसओ 885 9 -1 का सुपरसेट है।

+0

इस तरह: बाइट [] बाइट्स = एन्कोडिंग। गेट एन्कोडिंग (437) .GetBytes ("ê"); – Huppie

2

ASCII परिभाषित नहीं करता है; संख्या 136 विंडोज -1252 जैसे 8-बिट एन्कोडिंग में circumflex के लिए संख्या से आता है।

क्या आप सत्यापित कर सकते हैं कि circumflex (ê) के साथ एक छोटा ई वास्तव में इस मामले में एक्सेस डेटाबेस में संग्रहीत किया जाना चाहिए? शायद U + 02C6 U + 0065 एक रूपांतरण त्रुटि है, जहां इनपुट वास्तव में एक ई द्वारा एक स्वरित, या कोई अन्य विषय का पालन किया है का परिणाम है। शायद आपके एक्सेस डेटाबेस में भ्रष्ट डेटा है इस अर्थ में कि नामित एन्कोडिंग सामग्री से मेल नहीं खाती है, इस स्थिति में .NET क्लाइंट डेटा को गलत तरीके से पार्स कर सकता है (गलत डिकोडर का उपयोग करके)।

यदि यह त्रुटि वास्तव में डेटाबेस से पढ़ने के दौरान पेश की जाती है, तो शायद कुछ कोड या कॉन्फ़िगरेशन सेटिंग्स चिपकाकर मदद मिल सकती है।

Code page 437 में, चरित्र संख्या 136 एक स्वरित के साथ एक ई है।

+0

धन्यवाद! आपकी टिप ने बहुत मदद की, वास्तव में यह कोडपेज 437 (एमएस-डॉस) था। एन्कोडिंग का उपयोग करना। गेट एन्कोडिंग (437) यह काम करता है। – Huppie

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