2009-01-31 8 views
5

मान लीजिए कि कुछ प्रतिकूल कारणों से आप यूटीएफ 8 स्ट्रिंग की कच्ची बाइट सामग्री प्रदर्शित करना चाहते हैं।डेल्फी 200 रॉबेटस्ट्रिंग अनियमित

var 
    utf8Str : UTF8String; 
begin  
    utf8Str := '€ąćęłńóśźż'; 
end; 

(1) यह ऐसा नहीं करता है, यह प्रदर्शित करता है पठनीय रूप:

memo1.Lines.Add(RawByteString(utf8Str)); 
// output: '€ąćęłńóśźż' 

(2) लेकिन यह करता है "काम" - संयोजन पर ध्यान दें:

memo1.Lines.Add('x' + RawByteString(utf8Str)); 
// output: 'x€ąćęłńóśźż' 

मैं समझता हूं (1), यद्यपि युनिकोडस्ट्रिंग के लिए कंपाइलर के मजबूर सहक्रिया को कभी भी रॉबेटस्ट्रिंग var प्रदर्शित करने से रोकना प्रतीत होता है जैसा है। हालांकि, व्यवहार क्यों बदलता है (2)? -

(3) अजनबी अभी भी के संयोजन रिवर्स करते हैं:

memo1.Lines.Add(RawByteString(utf8Str) + 'x'); 
// output: '€ąćęłńóśźżx' 

मैं डेल्फी में फै़शनवाला स्ट्रिंग प्रकार पर पढ़ रहा है और सोचा था कि मैं समझ गया कि वे कैसे काम करते हैं, लेकिन यह एक पहेली है ।

उत्तर

9

RawByteString विभिन्न कोडपेज affinities के साथ AnsiString एस के विभिन्न स्वादों के साथ काम करने वाले कार्यों के लिए आवश्यक ओवरलोड की संख्या को कम करने के लिए मौजूद है।

सामान्य रूप से, RawByteString प्रकार के चर घोषित न करें। उस प्रकार के टाइपकास्ट मान न करें। उस प्रकार के चर पर concatenations मत करो। केवल बातें आप कर सकते हैं के बारे में कर रहे हैं:

  • इस प्रकार का एक पैरामीटर (मूल उद्देश्य) इस तरह के एक पैरामीटर
  • बुद्धिमान कार्य है कि जाँच इस तरह के एक पैरामीटर में सर्च कर रहे हैं पर
  • अनुक्रमण की घोषणा StringCodePage फ़ंक्शन का उपयोग करके स्ट्रिंग का वास्तविक कोड पृष्ठ।

उदाहरण के लिए, आप ध्यान दें कि StringCodePage फ़ंक्शन स्वयं RawByteString का उपयोग अपने तर्क प्रकार के रूप में करता है। इस तरह, यह किसी तर्क के रूप में पास करने से पहले कोडपृष्ठ अनुवाद करने के बजाय किसी भी AnsiString के साथ काम करेगा।

आपके मामले के लिए, concatenations जैसी चीजें काफी हद तक अपरिभाषित हैं। आरटीएम और अपडेट 2 के बीच व्यवहार बदल गया, लेकिन जब आरटीएल स्ट्रिंग कॉन्सटेनेशन फ़ंक्शन अलग-अलग कोड पृष्ठों के साथ एकाधिक स्ट्रिंग प्राप्त करते हैं, तो अंतिम स्ट्रिंग के लिए कोड कोड का उपयोग करने के लिए इसका कोई आसान तरीका नहीं है। यही कारण है कि आपको उनसे सम्मिलित नहीं करना चाहिए जैसा आप यहां करते हैं।

+0

थान, बैरी, जो अच्छी समझ में आता है।कॉन्सटेनेशन सिर्फ एक "व्यावहारिक मूल्य के कुछ भी नहीं," मैं इस बटन को दबाता हूं "प्रयोग था। अजीब हालांकि डेल्फी को इस तरह के एक अपरिभाषित व्यवहार को पेश करने के लिए अजीब - पहले कभी भी उनमें से कई नहीं थे। –

1

आप एक टीएमईओ "जैसा है" में एक स्ट्रिंग नहीं जोड़ सकते हैं। तुम हमेशा, इसलिए यूनिकोड करने के लिए रूपांतरण के कुछ प्रकार की जरूरत है कि है, क्योंकि सभी TMemo बारे में जानता है डेल्फी 2009

आप नाटक करने के लिए है कि अपने UTF8String कोड पेज 1252 का उपयोग करता है चाहते हैं, इस कार्य करें: के लिए

var 
    utf8Str : UTF8String; 
    Raw: RawByteString; 
begin 
    utf8Str := '€ąćęłńóśźż'; 
    Raw := utf8Str; 
    SetCodePage(Raw, 1252, False); 
    Memo.Lines.Add(Raw); 
end; 

अधिक जानकारी, मेरा आलेख देखें Using RawByteString Effectively

+0

यूटीएफ -8 एक 8-बिट एन्कोडिंग है। इसके लिए संसाधित होने के लिए कोडनिट्स $ 00- $ एफएफ की आवश्यकता होती है। हालांकि, यूटीएफ -16 में कनवर्ट किए जाने पर कोडपेज 1252 मानचित्र $ 80- $ 9F को अलग-अलग मानों पर कोडनिट करता है। आपको इसके बजाय कोडपृष्ठ 28591 (आईएसओ -885 9 -1) का उपयोग करना चाहिए। –

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