22

में हाय-अंसी वर्णों को कनवर्ट करें क्या डेल्फी 2007 में एएनएसआई तालिका (> 127) की उच्च श्रेणी में वर्णों को शुद्ध ASCII (<) में उनके समकक्षों में परिवर्तित करने के लिए नियमित रूप से उपलब्ध है। = 127) एक लोकेल (कोडपेज) के अनुसार?असी समकक्ष (é -> ई)

मुझे पता है कि कुछ वर्ण अच्छी तरह से अनुवाद नहीं कर सकते हैं लेकिन अधिकांश, esp।

  • एक
  • àएक
  • ë: 192-255 रेंज में
  • Çसी
  • ç
  • -(पानी का छींटा एन)-(हाइफन - जटिल काम हो सकता है कि)
  • -(एम डैश)-(हाइफन)

उत्तर

27

WideCharToMultiByte कि अलग करना विशेषक सहित निर्दिष्ट वर्ण सेट, द्वारा समर्थित नहीं हैं कोई भी वर्ण के लिए सबसे फिट मानचित्रण करता है। आप इसे ठीक से कर सकते हैं और 20127 (यूएस-एएससीआईआई) को कोडपेज के रूप में पास कर सकते हैं।

function BestFit(const AInput: AnsiString): AnsiString; 
const 
    CodePage = 20127; //20127 = us-ascii 
var 
    WS: WideString; 
begin 
    WS := WideString(AInput); 
    SetLength(Result, WideCharToMultiByte(CodePage, 0, PWideChar(WS), 
    Length(WS), nil, 0, nil, nil)); 
    WideCharToMultiByte(CodePage, 0, PWideChar(WS), Length(WS), 
    PAnsiChar(Result), Length(Result), nil, nil); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowMessage(BestFit('aÀàËëÇç–—€¢Š')); 
end; 

कॉलिंग कि आपके उदाहरणों के साथ पैदा करता है परिणाम आप देख रहे हैं, emdash-टू-शून्य से मामला है, जो मुझे नहीं लगता कि जेरोन के सुझाव द्वारा नियंत्रित किया जाता डी प्रपत्र सामान्यीकरण में बदलने के लिए यदि आपने ऐसा किया है सहित उस दृष्टिकोण को लेना चाहते हैं, माइकल कपलन के पास blog post स्पष्ट रूप से डायक्रिटिक्स (सामान्य रूप से सामान्यीकरण के बजाए) को स्पष्ट रूप से चर्चा करता है, लेकिन यह सी # और एक एपीआई का उपयोग करता है जो Vista में पेश किया गया था। आप FoldString एपीआई (किसी भी WinNT रिलीज) का उपयोग कर कुछ मिल सकते हैं।

बेशक यदि आप केवल एक चरित्र सेट के लिए ऐसा कर रहे हैं, और आप ओवरहेड से वाइडस्ट्रिंग में और से कनवर्ट करने से बचना चाहते हैं, तो पडू सही है कि लूप और लुकअप टेबल के लिए एक सरल ।

+0

धन्यवाद क्रेग। यह लुकअप से अधिक सामान्य समाधान है। इसमें जादू संख्या में एक टाइपो था, इसलिए मैंने इसे सही किया और इसके बजाय स्थिर का उपयोग किया। लेकिन वैसे भी, यह डी 2007 के साथ-साथ डी 200 9 पर भी काम करता है। –

+0

एक बात हमने इसके साथ देखी, यह है कि 'β' (यूनिकोड 1E9E लैटिन कैपिटल अक्षर तेज एस) परिवर्तित नहीं होता है, इसलिए हम इसे पहले से करते हैं: स्ट्रिंगरप्लेस (एएसआरटी, 'β', 'एसएस', [आरएफआरईप्लेसएएल]) – PatrickvL

3

मेरा मानना ​​है कि आपका सर्वश्रेष्ठ दांव एक लुकअप तालिका पैदा कर रही है।

+0

इसके अलावा, यदि आप डेल्फी के साथ एक सभ्य रेगेक्स लाइब्रेरी का उपयोग कर रहे हैं, तो इसका भी उपयोग किया जा सकता है, लेकिन यह अभी भी एक लुकअप टेबल है। –

+0

धन्यवाद पडू। बिल्कुल यही मैने सोचा। मैं फिर भी क्रेग के जवाब को स्वीकार करूंगा क्योंकि यह अधिक सामान्य है। –

1

जो आप खोज रहे हैं वह सामान्यीकरण है।

माइकल कपलन ने nice blog article about normalization लिखा था।

यह आपकी समस्या का तुरंत समाधान नहीं करता है, लेकिन आपको सही दिशा में इंगित करता है।

--jeroen

+1

एनएफकेडी + संयोजन अंकों को हटाने में काफी समय लगता है। हालांकि, ऐसे अक्षर हैं जो 'ÆÐØÞßæðøþ' हैं जो विघटित नहीं होते हैं और उन्हें मैन्युअल रूप से निपटाया जाना चाहिए। – dan04

7

बस डेल्फी 2009 के लिए क्रेग की जवाब विस्तार करने के लिए:

आप डेल्फी 2009 और उपयोग करते हैं नए, आप एक अधिक पठनीय कोड एक ही परिणाम के साथ उपयोग कर सकते हैं:

function OStripAccents(const aStr: String): String; 
type 
    USASCIIString = type AnsiString(20127);//20127 = us ascii 
begin 
    Result := String(USASCIIString(aStr)); 
end; 

दुर्भाग्य से, इस कोड काम करता है केवल एमएस विंडोज़ पर। मैक पर, लहजे को सर्वश्रेष्ठ-फिट वर्णों द्वारा प्रतिस्थापित नहीं किया जाता है बल्कि प्रश्न चिह्नों द्वारा प्रतिस्थापित किया जाता है।

जाहिर है, डेल्फी आंतरिक रूप से विंडोज पर वाइडछारटोमोल्टीबीट का उपयोग करता है जबकि मैक आइकनव पर उपयोग किया जाता है (System.pas में LocaleCharsFromUnicode देखें)। सवाल यह है कि यदि विभिन्न ओएस पर यह अलग व्यवहार बग के रूप में माना जाना चाहिए और कोडकेंटल को सूचित किया जाना चाहिए।

+0

iconv में '// TRANSLIT' विकल्प है, लेकिन 'LocaleCharsFromUnicode()' इसका उपयोग नहीं करता है। –

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