2011-03-08 10 views

उत्तर

11

इस तरह का समारोह है कि तुम क्या जरूरत है क्या करेंगे:

function UTF8Bytes(const s: UTF8String): TBytes; 
begin 
    Assert(StringElementSize(s)=1); 
    SetLength(Result, Length(s)); 
    if Length(Result)>0 then 
    Move(s[1], Result[0], Length(s)); 
end; 

आप इसे स्ट्रिंग के किसी भी प्रकार से कॉल कर सकते हैं और RTL स्ट्रिंग कि UTF-8 में पारित हो जाता है की एन्कोडिंग से परिवर्तित कर देंगे। इसलिए सोचने में भ्रमित न हों कि आपको कॉल करने से पहले यूटीएफ -8 में परिवर्तित करना होगा, बस किसी भी स्ट्रिंग में पास करें और आरटीएल को काम करने दें।

उसके बाद यह एक मानक मानक सरणी प्रति है। एक यूटीएफ -8 एन्कोडेड स्ट्रिंग के लिए स्ट्रिंग तत्व आकार पर धारणा को स्पष्ट रूप से धारण करने वाले दावे पर ध्यान दें।

आप शून्य टर्मिनेटर प्राप्त करना चाहते हैं तो आप ऐसा लिखते थे:

function UTF8Bytes(const s: UTF8String): TBytes; 
begin 
    Assert(StringElementSize(s)=1); 
    SetLength(Result, Length(s)+1); 
    if Length(Result)>0 then 
    Move(s[1], Result[0], Length(s)); 
    Result[high(Result)] := 0; 
end; 
+0

+1। 'जोर दें (स्ट्रिंग एलिमेंट साइज = 1);' कभी असफल हो? –

+1

@Cosmin नहीं यह नहीं होगा। दावे के बारे में यही बात है! –

+0

एक प्रश्न .. StringElementSize()? (Lazarus) का उपयोग करने के लिए मुझे क्या इकाई जोड़नी है। ऐसे प्रश्नों के लिए खेद है, मैं एक नौसिखिया – Mariusz

4
var S: UTF8String; 
    B: TBytes; 

begin 
    S := 'Șase sași în șase saci'; 
    SetLength(B, Length(S)); // Length(s) = 26 for this 22 char string. 
    CopyMemory(@B[0], @S[1], Length(S)); 
end. 

आपको बाइट्स की आवश्यकता के आधार पर, आप एक पूर्ण टर्मिनेटर शामिल करना चाहेंगे।

उत्पादन कोड के लिए सुनिश्चित करें कि आप खाली स्ट्रिंग के लिए परीक्षण करते हैं। आवश्यक 3-4 एलओसी जोड़ना सिर्फ नमूना को पढ़ने के लिए कठिन बना देगा।

+0

स्ट्रिंग खाली होने पर विफल रहता है –

+1

स्ट्रिंग खाली नहीं है। इसमें मूल्य '' Şase saşi în şase saci'' –

+0

+1 है। हर कोई नहीं (कम से कम कहने के लिए!) जानता है कि कैसे 'लंबाई' समारोह वास्तव में काम करता है! –

8

आप SysUtils.pas

+0

+1 देखें। यह सबसे अच्छा तरीका है। –

+5

ध्यान दें कि यदि इनपुट स्ट्रिंग * पहले से ही * यूटीएफ -8 के रूप में एन्कोड किया गया है, तो 'गेटबाइट्स' बहुत अपमानजनक होगा। कंपाइलर इनपुट स्ट्रिंग को यूनिकोडस्ट्रिंग में परिवर्तित कर देगा क्योंकि यह एकमात्र स्ट्रिंग तर्क 'गेटबाइट्स' की अनुमति देता है, और 'गेटबाइट्स' पात्रों को इसके परिणाम उत्पन्न करने के लिए वापस यूटीएफ -8 में परिवर्तित कर देगा। –

5

में TEncoding.UTF8.GetBytes का उपयोग आप डेल्फी 2009 या बाद में उपयोग कर रहे हैं कर सकते हैं (यूनिकोड संस्करण), एक UTF8String करने के लिए एक WideString परिवर्तित करने के लिए एक सरल काम कथन है:

var 
    ws: WideString; 
    u8s: UTF8String; 

u8s := ws; 

संकलक रूपांतरण करने के लिए सही पुस्तकालय समारोह कॉल करेंगे क्योंकि यह वें जानता है यूटीएफ 8 स्ट्रिंग के प्रकारों पर CP_UTF8 का "कोड पेज" है।

डेल्फी 7 और बाद में, आप प्रदत्त लाइब्रेरी फ़ंक्शन Utf8Encode का उपयोग कर सकते हैं। पहले के संस्करणों के लिए, आप जेसीएल जैसे अन्य पुस्तकालयों से उस समारोह को प्राप्त कर सकते हैं।

आप Windows एपीआई का उपयोग कर अपने स्वयं के रूपांतरण समारोह लिख सकते हैं:

function CustomUtf8Encode(const ws: WideString): UTF8String; 
var 
    n: Integer; 
begin 
    n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), nil, 0, nil, nil); 
    Win32Check(n <> 0); 
    SetLength(Result, n); 
    n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), PAnsiChar(Result), n, nil, nil); 
    Win32Check(n = Length(Result)); 
end; 

समय का एक बहुत, तो आप बस एक UTF8String एक सरणी के रूप में उपयोग कर सकते हैं, लेकिन क्या तुम सच में एक बाइट सरणी की जरूरत है, तो आप डेविड और कोसमैन के कार्यों का उपयोग कर सकते हैं। यदि आप अपना खुद का चरित्र-रूपांतरण फ़ंक्शन लिख रहे हैं, तो आप UTF8String को छोड़ सकते हैं और सीधे बाइट सरणी पर जा सकते हैं; बस वापसी प्रकार को TBytes या array of Byte पर बदलें। (यदि आप सरणी को निरस्त करने के लिए चाहते हैं, तो आप लंबाई को भी बढ़ाना चाहते हैं। सेटलेथेंथ स्ट्रिंग को पूरी तरह से स्ट्रिंग पर कर देगा, लेकिन सरणी में।)

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

1

मैं निम्नलिखित दो दिनचर्या (स्रोत कोड यहाँ डाउनलोड किया जा सकता है - http://www.csinnovations.com/framework_utilities.htm) है

समारोह CsiBytesToStr (स्थिरांक pInData: TByteDynArray; pStringEncoding: TECsiStringEncoding; pIncludesBom: बूलियन): स्ट्रिंग;

फ़ंक्शन सीएसआईआरटीटीओबाइट्स (कॉन्स पीआईएनएसआरटी: स्ट्रिंग; पीस्ट्रिंगएन्कोडिंग: टीईसीएसस्ट्रिंग एन्कोडिंग; पी इनक्लेब बॉम: बूलियन): टीबीटीडीनएरे;

0

widestring -> UTF8:

http://www.freepascal.org/docs-html/rtl/system/utf8decode.html

विपरीत:

http://www.freepascal.org/docs-html/rtl/system/utf8encode.html

ध्यान दें कि एक पूर्व D2009 प्रणाली (वर्तमान मुफ्त पास्कल सहित) में एक ansistring करने के लिए एक widestring बताए होगा स्थानीय ansi एन्कोडिंग, कर्कश पात्रों में कनवर्ट करें।

टीबीइट्स भाग के लिए, ऊपर रॉब केनेडी की टिप्पणी देखें।

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