2008-09-26 13 views
19

मैं उच्च बिट एसीआई अक्षरों (जैसे, Ü जो एएससीआई 154 बढ़ाया गया है) को यू (जो एएससीआई 85 है) में परिवर्तित करने के लिए छद्म कोड या नमूना कोड की तलाश में है।मैं 8 बिट अक्षरों को 7 बिट वर्णों में कैसे अनुवाद करूं? (i.e. Ü से यू)

मेरा प्रारंभिक अनुमान यह है कि चूंकि केवल 25 एसीआईआई वर्ण हैं जो 7 बिट एसीआईआई अक्षरों के समान हैं, एक अनुवाद सरणी का उपयोग करना होगा।

मुझे बताएं कि क्या आप किसी और चीज के बारे में सोच सकते हैं।

उत्तर

5

वास्तव में अप्रत्याशित द्वारा प्रस्तावित: "iconv" फ़ंक्शन आपके लिए सभी अजीब रूपांतरणों को संभालने के लिए मौजूद है, लगभग सभी प्रोग्रामिंग भाषा में उपलब्ध है और इसमें एक विशेष विकल्प है जो अनुमान के साथ लक्ष्य सेट में अनुपलब्ध वर्णों को परिवर्तित करने का प्रयास करता है।

अपने इनपुट यूटीएफ -8 स्ट्रिंग को 7 बिट ASCII में कनवर्ट करने के लिए iconv का उपयोग करें।

अन्यथा, आप हमेशा कोने केस को मारना बंद कर देंगे: वर्णों के एक अलग सेट के साथ एक अलग कोडपेज का उपयोग करके एक 8 बिट इनपुट (इस प्रकार आपकी रूपांतरण तालिका के साथ बिल्कुल काम नहीं कर रहा है), एक आखिरी बेवकूफ उच्चारण कैरेक्टर (आप सभी गंभीर/तीव्र उच्चारण मैप किए गए, लेकिन चेक कैरॉन या नॉर्डिक '°' को मानचित्रित करना भूल गए), आदि

बेशक यदि आप एक छोटी विशिष्ट समस्या के समाधान को लागू करना चाहते हैं (आपके लिए फ़ाइल-सिस्टम अनुकूल फ़ाइल नाम बनाना संगीत संग्रह) लुक-अप सरणी जाने का तरीका है (या तो एक सरणी जो 128 अंकों से ऊपर प्रत्येक कोड संख्या के लिए जीबी द्वारा प्रस्तावित 128 के तहत अनुमानित है, या vIceBerg द्वारा प्रस्तावित स्रोत/लक्ष्य जोड़े जो प्रतिस्थापन कार्यों के आधार पर हैं आपकी पसंद की भाषा में पहले से ही उपलब्ध है), क्योंकि यह जल्दी से एक साथ हैक किया गया है और जल्दी से गायब तत्वों की जांच करें।

0

मुझे लगता है कि आप इसे पहले से ही सिर पर खींचा है। आपके सीमित डोमेन को देखते हुए, रूपांतरण सरणी या हैश आपकी सर्वश्रेष्ठ शर्त है। स्वचालित रूप से ऐसा करने की कोशिश करने के लिए कुछ जटिल बनाने का कोई मतलब नहीं है।

6

मुझे लगता है कि आप बस नहीं कर सकते हैं।

मैं आमतौर पर ऐसा ही कुछ कार्य करें:

AccentString = 'ÀÂÄÉÈÊ [और अन्य सभी]'
ConvertString = 'AAAEEE [और अन्य सभी]'

AccentString में चार के लिए खोज रहे हैं और ConvertString

HTH

1

में एक ही सूचकांक के लिए जगह आप मुझे लगता है कि किसी न किसी लगते हैं। बाइट्स की 128 बाइट लंबी सरणी, चार & 127 द्वारा अनुक्रमित, जिसमें 8-बिट बिट वर्ण के लिए मिलान 7-बिट वर्ण होता है।

0

एक लुकअप सरणी शायद इसे पूरा करने का सबसे सरल और तेज़ तरीका है। यह एक तरीका है कि आप एएससीआईआईआई को ईबीसीडीआईसी में परिवर्तित कर सकते हैं।

1

एचएम, स्ट्रिंग के एन्कोडिंग को आइकनव के साथ क्यों न बदलें?

1

यह वास्तव में आपके स्रोत तारों की प्रकृति पर निर्भर करता है। आप स्ट्रिंग के कूट जानते हैं, और आप जानते हैं कि यह एक 8 बिट एन्कोडिंग अगर - - उदाहरण के लिए, आईएसओ लैटिन 1 या इसी तरह तो एक साधारण स्थिर सरणी के लिए पर्याप्त है:

static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... } 
... 
new_c = xlate[old_c]; 

दूसरी ओर, अगर आपके पास एक अलग एन्कोडिंग, या यदि आप यूटीएफ -8 एन्कोडेड तारों का उपयोग कर रहे हैं, तो आपको शायद ICU लाइब्रेरी में बहुत उपयोगी कार्य मिलेंगे।

17

अधिकांश भाषाओं में मानक ASCII के साथ उच्चारण वर्णों को प्रतिस्थापित करने का एक मानक तरीका है, लेकिन यह भाषा पर निर्भर करता है, और इसमें अक्सर एक एसीसीआईआई वाले एक उच्चारण वाले चरित्र को प्रतिस्थापित करना शामिल होता है। जैसे जर्मन में ü बन जाता है। इसलिए यदि आप प्राकृतिक भाषाओं को सही तरीके से संभालना चाहते हैं तो यह आपके विचार से कहीं अधिक जटिल है।

0

ऊपरी 128 वर्णों के मानक अर्थ नहीं हैं। वे उपयोगकर्ता की भाषा के आधार पर अलग-अलग व्याख्याएं (कोड पेज) ले सकते हैं।

उदाहरण के लिए, को देखने के Portuguese बनाम French Canadian

जब तक आप कोड पेज पता है, अपने "अनुवाद" कभी कभी गलत हो जाएगा।

यदि आप एक निश्चित कोड पृष्ठ (जैसे मूल आईबीएम कोड पृष्ठ) मानने जा रहे हैं तो एक अनुवाद सरणी काम करेगी, लेकिन वास्तविक अंतरराष्ट्रीय उपयोगकर्ताओं के लिए, यह बहुत गलत होगा।

यह एक कारण है कि कोड पृष्ठों की पुरानी प्रणाली पर यूनिकोड का पक्ष क्यों है।

कड़ाई से बोलते हुए, ASCII केवल 7 बिट्स है।

11

क्या आप वास्तव में क्या करना चाहते हैं Ü से यू को परिवर्तित कर रहे हैं? मुझे अन्य भाषाओं के बारे में पता नहीं है, लेकिन जर्मन में यू यू बन जाएगा, ओई बन जाएगा, आदि

+2

यह भी आसान नहीं है, Ü सभी अपरकेस शब्द –

+0

में उपयोग किए जाने पर यूई बन जाएगा, ऐसे कुछ परिदृश्य भी हैं जहां 7-बिट वर्ण सेट का उपयोग किया जाना चाहिए, जैसे कि SMTP Content-Transfer-Encoding - en.wikipedia। org/wiki/माइम # सामग्री-स्थानांतरण-एन्कोडिंग। एक साइड नोट के रूप में, यदि आप एसएमटीपी मुद्दों के कारण इस पोस्ट को देख रहे हैं, तो अपने एसएमटीपी क्लाइंट/लाइब्रेरी की यूएनएनकोडिंग सुविधाओं को देखें। –

5

कोड पृष्ठ 1251 में, वर्णों को 2 बाइट्स के साथ कोड किया जाता है: एक मूल चार के लिए और एक भिन्नता के लिए। फिर, जब आप एएससीआईआईआई में वापस एन्कोड करते हैं, तो केवल मूल वर्ण रखे जाते हैं।

public string RemoveDiacritics(string text) 
{ 

    return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text)); 

} 

से: http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine-(proprement).aspx

+0

धन्यवाद, यह मेरी समस्या हल हो गया! – codeape

1

कि अच्छा लग रहा है CodeProject पर एक लेख है।

कोडपेज 1251 का उपयोग करके रूपांतरण भी मेरी रुचि लेता है (अन्य उत्तर देखें)।

मुझे रूपांतरण तालिका पसंद नहीं है, क्योंकि यूनिकोड में वर्णों की संख्या इतनी बड़ी है कि आप आसानी से किसी को याद करते हैं।

0

मैं इस सुविधा का उपयोग लहजे के साथ एक चर ठीक करने के लिए VB6 से एक साबुन कार्य करने के लिए पारित करने के लिए:

Function FixAccents(ByVal Valor As String) As String 

    Dim x As Long 
    Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";") 

    For x = 127 To 255 
     Valor = Replace(Valor, Chr$(x), "&#" & x & ";") 
    Next 

    FixAccents = Valor 

End Function 

और साबुन समारोह मैं यह कर (चर फ़ाइल नाम के लिए) के अंदर:

FileName = HttpContext.Current.Server.HtmlDecode(FileName) 
26

.NET उपयोगकर्ताओं के लिए article in CodeProject (GvS's tip पर धन्यवाद) वास्तव में अब तक किसी भी अन्य प्रश्न से अधिक सही तरीके से प्रश्न का उत्तर देता है।

हालांकि उस आलेख में कोड (समाधान # 1 में) बोझिल है।यहाँ एक कॉम्पैक्ट संस्करण है:

// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in 
private static string LatinToAscii(string inString) 
{ 
    var newStringBuilder = new StringBuilder(); 
    newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD) 
            .Where(x => x < 128) 
            .ToArray()); 
    return newStringBuilder.ToString(); 
} 

जवाब पर थोड़ा विस्तार करने के लिए, इस विधि का उपयोग करता है String.Normalize जो:

एक नया स्ट्रिंग जिसका शाब्दिक मान देता है इस स्ट्रिंग के रूप में एक ही है, लेकिन जिसका बाइनरी प्रतिनिधित्व निर्दिष्ट यूनिकोड सामान्यीकरण फ़ॉर्म में है।

विशेष रूप से इस मामले में हम NormalizationFormFormKD, जैसे उन्हीं MSDN डॉक्स में वर्णित का उपयोग करें:

FormKD - यह दर्शाता है कि एक यूनिकोड स्ट्रिंग पूर्ण संगतता अपघटन का उपयोग कर सामान्य है।

यूनिकोड सामान्यीकरण रूपों के बारे में अधिक जानकारी के लिए, Unicode Annex #15 देखें।

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