यूटीएफ -8 में बाइट सरणी में एक वाइडस्ट्रिंग (या अन्य लंबी स्ट्रिंग) को कैसे परिवर्तित करें?यूटीएफ -8 में बाइट सरणी के लिए स्ट्रिंग?
उत्तर
इस तरह का समारोह है कि तुम क्या जरूरत है क्या करेंगे:
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;
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 एलओसी जोड़ना सिर्फ नमूना को पढ़ने के लिए कठिन बना देगा।
स्ट्रिंग खाली होने पर विफल रहता है –
स्ट्रिंग खाली नहीं है। इसमें मूल्य '' Şase saşi în şase saci'' –
+1 है। हर कोई नहीं (कम से कम कहने के लिए!) जानता है कि कैसे 'लंबाई' समारोह वास्तव में काम करता है! –
आप SysUtils.pas
+1 देखें। यह सबसे अच्छा तरीका है। –
ध्यान दें कि यदि इनपुट स्ट्रिंग * पहले से ही * यूटीएफ -8 के रूप में एन्कोड किया गया है, तो 'गेटबाइट्स' बहुत अपमानजनक होगा। कंपाइलर इनपुट स्ट्रिंग को यूनिकोडस्ट्रिंग में परिवर्तित कर देगा क्योंकि यह एकमात्र स्ट्रिंग तर्क 'गेटबाइट्स' की अनुमति देता है, और 'गेटबाइट्स' पात्रों को इसके परिणाम उत्पन्न करने के लिए वापस यूटीएफ -8 में परिवर्तित कर देगा। –
में 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 में परिवर्तित करना है।
मैं निम्नलिखित दो दिनचर्या (स्रोत कोड यहाँ डाउनलोड किया जा सकता है - http://www.csinnovations.com/framework_utilities.htm) है
समारोह CsiBytesToStr (स्थिरांक pInData: TByteDynArray; pStringEncoding: TECsiStringEncoding; pIncludesBom: बूलियन): स्ट्रिंग;
फ़ंक्शन सीएसआईआरटीटीओबाइट्स (कॉन्स पीआईएनएसआरटी: स्ट्रिंग; पीस्ट्रिंगएन्कोडिंग: टीईसीएसस्ट्रिंग एन्कोडिंग; पी इनक्लेब बॉम: बूलियन): टीबीटीडीनएरे;
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 एन्कोडिंग, कर्कश पात्रों में कनवर्ट करें।
टीबीइट्स भाग के लिए, ऊपर रॉब केनेडी की टिप्पणी देखें।
- 1. यूटीएफ -8 निरंतर बाइट
- 2. 2-बाइट यूटीएफ -8 अनुक्रम
- 3. क्या यूटीएफ 8 अक्षरों के लिए डिलीमीटर बाइट हैं?
- 4. यूटीएफ -8 स्ट्रिंग
- 5. यूटीएफ -8 स्ट्रिंग
- 6. यूटीएफ -8 स्ट्रिंग
- 7. PGError: त्रुटि: एन्कोडिंग के लिए अमान्य बाइट अनुक्रम "यूटीएफ 8
- 8. org.xml.sax.SAXParseException: 3-बाइट यूटीएफ -8 अनुक्रम
- 9. जावा सरणी सॉर्ट यूटीएफ -8
- 10. स्ट्रीमवाइटर और यूटीएफ -8 बाइट ऑर्डर मार्क्स
- 11. जावा में एक यूटीएफ -8 स्ट्रिंग से 4 (+) - बाइट वर्णों को प्रतिस्थापित/निकालने के लिए कैसे?
- 12. यूटीएफ -8
- 13. एक यूटीएफ -8 एन्कोडेड स्ट्रिंग
- 14. MalformedByteSequenceException: 2-बाइट यूटीएफ -8 अनुक्रम का अमान्य बाइट 2
- 15. यूटीएफ -8
- 16. अरबी यूटीएफ 8 + अंग्रेजी स्ट्रिंग
- 17. रूबी 1.9: मल्टीबाइट यूटीएफ -8 अक्षरों के साथ स्ट्रिंग करने के लिए बाइट सरणी को कनवर्ट करें
- 18. मैं यूटीएफ -8 स्ट्रिंग को डार्ट में बाइट्स की सरणी में कैसे परिवर्तित करूं?
- 19. मेरे पास यूटीएफ -8 है - लेकिन अभी भी "1-बाइट यूटीएफ -8 अनुक्रम का अमान्य बाइट 1"
- 20. पर्ल फ़ाइल आउटपुट में बल यूटीएफ -8 बाइट ऑर्डर मार्क
- 21. यूटीएफ -8 त्रुटि में रेल, हेरोकू और अमान्य बाइट अनुक्रम
- 22. यूटीएफ -16 यूटीएफ -8 रूपांतरण (विंडोज़ में स्क्रिप्टिंग के लिए)
- 23. विंडोज़ में यूटीएफ -8
- 24. यूटीएफ -8 डेटा के लिए सर्वश्रेष्ठ प्रकार?
- 25. यूटीएफ -8
- 26. यूटीएफ -8
- 27. यूटीएफ -8
- 28. यूटीएफ -8
- 29. यूटीएफ -8
- 30. सबडोमेन में यूटीएफ -8?
+1। 'जोर दें (स्ट्रिंग एलिमेंट साइज = 1);' कभी असफल हो? –
@Cosmin नहीं यह नहीं होगा। दावे के बारे में यही बात है! –
एक प्रश्न .. StringElementSize()? (Lazarus) का उपयोग करने के लिए मुझे क्या इकाई जोड़नी है। ऐसे प्रश्नों के लिए खेद है, मैं एक नौसिखिया – Mariusz