Embarcadero Delphi
स्ट्रिंग्स
खोज…
स्ट्रिंग प्रकार
डेल्फी में निम्नलिखित स्ट्रिंग प्रकार हैं (लोकप्रियता के क्रम में):
प्रकार | अधिकतम लंबाई | न्यूनतम आकार | विवरण |
---|---|---|---|
string | 2GB | 16 बाइट्स | एक प्रबंधित स्ट्रिंग। डेल्फी 2007 के माध्यम से AnsiString लिए एक उपनाम, और डेल्फी 2009 के रूप में UnicodeString लिए एक उपनाम। |
UnicodeString | 2GB | 16 बाइट्स | UTF-16 प्रारूप में एक प्रबंधित स्ट्रिंग। |
AnsiString | 2GB | 16 बाइट्स | प्री-यूनिकोड ANSI प्रारूप में एक प्रबंधित स्ट्रिंग। डेल्फी 2009 के रूप में, यह एक स्पष्ट कोड-पृष्ठ संकेतक करता है। |
UTF8String | 2GB | 16 बाइट्स | UTF-8 प्रारूप में एक प्रबंधित स्ट्रिंग, एक UTF-8 कोड पृष्ठ के साथ AnsiString रूप में लागू किया गया। |
ShortString | 255 चरस | 2 बाइट्स | एक विरासत, निश्चित लंबाई, बहुत कम ओवरहेड के साथ अप्रबंधित स्ट्रिंग |
WideString | 2GB | 4 निवाले | COM इंटरोप के लिए इरादा, UTF-16 प्रारूप में एक प्रबंधित स्ट्रिंग। Windows BSTR प्रकार के समतुल्य। |
UnicodeString
और AnsiString
को संदर्भ और कॉपी-ऑन-राइट (COW) के संदर्भ में गिना जाता है ।
ShortString
और WideString
को संदर्भ नहीं दिया गया है और गाय शब्दार्थ नहीं है।
स्ट्रिंग्स
uses
System.Character;
var
S1, S2: string;
begin
S1 := 'Foo';
S2 := ToLower(S1); // Convert the string to lower-case
S1 := ToUpper(S2); // Convert the string to upper-case
घर का काम
uses
Character;
var
C1, C2: Char;
begin
C1 := 'F';
C2 := ToLower(C1); // Convert the char to lower-case
C1 := ToUpper(C2); // Convert the char to upper-case
यदि संस्करण XE2 या उससे ऊपर का है, तो क्लॉज का uses
System.Character
होना चाहिए।
अपर व लोअरकेस
uses
SysUtils;
var
S1, S2: string;
begin
S1 := 'Foo';
S2 := LowerCase(S1); // S2 := 'foo';
S1 := UpperCase(S2); // S1 := 'FOO';
असाइनमेंट
स्ट्रिंग को विभिन्न स्ट्रिंग प्रकारों में असाइन करना और रनटाइम वातावरण उनके बारे में कैसे व्यवहार करता है। मेमोरी एलोकेशन, रेफरेंस काउंटिंग, चार्ज्ड के लिए इंडेक्सेड एक्सेस और कंपाइलर एरर जहां लागू हो, संक्षेप में वर्णित हैं।
var
SS5: string[5]; {a shortstring of 5 chars + 1 length byte, no trailing `0`}
WS: Widestring; {managed pointer, with a bit of compiler support}
AS: ansistring; {ansistring with the default codepage of the system}
US: unicodestring; {default string type}
U8: UTF8string;//same as AnsiString(65001)
A1251: ansistring(1251); {ansistring with codepage 1251: Cryllic set}
RB: RawbyteString; {ansistring with codepage 0: no conversion set}
begin
SS5:= 'test'; {S[0] = Length(SS254) = 4, S[1] = 't'...S[5] = undefined}
SS5:= 'test1'; {S[0] = 5, S[5] = '1', S[6] is out of bounds}
SS5:= 'test12'; {compile time error}
WS:= 'test'; {WS now points to a constant unicodestring hard compiled into the data segment}
US:= 'test'+IntToStr(1); {New unicode string is created with reference count = 1}
WS:= US; {SysAllocateStr with datacopied to dest, US refcount = 1 !}
AS:= US; {the UTF16 in US is converted to "extended" ascii taking into account the codepage in AS possibly losing data in the process}
U8:= US; {safe copy of US to U8, all data is converted from UTF16 into UTF8}
RB:= US; {RB = 'test1'#0 i.e. conversion into RawByteString uses system default codepage}
A1251:= RB; {no conversion takes place, only reference copied. Ref count incremented }
संदर्भ की गिनती
तार पर संदर्भों की गिनती धागा-सुरक्षित है। प्रक्रिया को सुरक्षित करने के लिए ताले और अपवाद हैंडलर का उपयोग किया जाता है। संदर्भ कोडों को प्रबंधित करने के लिए संकलक कोड को संकलित करने के लिए संकलक कोड कहाँ इंगित करता है, टिप्पणी के साथ, निम्नलिखित कोड पर विचार करें:
procedure PassWithNoModifier(S: string);
// prologue: Increase reference count of S (if non-negative),
// and enter a try-finally block
begin
// Create a new string to hold the contents of S and 'X'. Assign the new string to S,
// thereby reducing the reference count of the string S originally pointed to and
// brining the reference count of the new string to 1.
// The string that S originally referred to is not modified.
S := S + 'X';
end;
// epilogue: Enter the `finally` section and decrease the reference count of S, which is
// now the new string. That count will be zero, so the new string will be freed.
procedure PassWithConst(const S: string);
var
TempStr: string;
// prologue: Clear TempStr and enter a try-finally block. No modification of the reference
// count of string referred to by S.
begin
// Compile-time error: S is const.
S := S + 'X';
// Create a new string to hold the contents of S and 'X'. TempStr gets a reference count
// of 1, and reference count of S remains unchanged.
TempStr := S + 'X';
end;
// epilogue: Enter the `finally` section and decrease the reference count of TempStr,
// freeing TempStr because its reference count will be zero.
जैसा कि ऊपर दिखाया गया है, एक पैरामीटर में संशोधनों को रखने के लिए अस्थायी स्थानीय स्ट्रिंग को शुरू करने से उस पैरामीटर में सीधे संशोधन करने के साथ ही ओवरहेड शामिल होता है। एक स्ट्रिंग की घोषणा const
केवल संदर्भ गिनती से बचा जाता है जब स्ट्रिंग पैरामीटर सही मायने में केवल पढ़ने के लिए। हालांकि, एक समारोह के बाहर कार्यान्वयन विवरण लीक से बचने के लिए, यह सलाह दी जाती हमेशा से एक का उपयोग करने के लिए है const
, var
, या out
स्ट्रिंग पैरामीटर पर।
एन्कोडिंग
स्ट्रिंग प्रकार जैसे यूनिकोडस्ट्रिंग, एन्सिस्ट्रिंग, वाइडस्ट्रिंग और यूटीएफ 8 स्ट्रींग को उनके संबंधित एन्कोडिंग का उपयोग करके मेमोरी में संग्रहीत किया जाता है (अधिक विवरण के लिए स्ट्रिंग प्रकार देखें)। एक प्रकार की स्ट्रिंग को दूसरे में निर्दिष्ट करने के परिणामस्वरूप रूपांतरण हो सकता है। टाइप स्ट्रिंग को स्वतंत्र रूप से एन्कोडिंग करने के लिए डिज़ाइन किया गया है - आपको कभी भी इसके आंतरिक प्रतिनिधित्व का उपयोग नहीं करना चाहिए।
वर्ग Sysutils.TEncoding
तरीका प्रदान करता है GetBytes
परिवर्तित करने के लिए string
को TBytes
(बाइट्स की सरणी) और GetString
परिवर्तित करने के लिए TBytes
के लिए string
। वर्ग Sysutils.TEncoding
भी वर्ग गुणों के रूप में कई पूर्वनिर्धारित एन्कोडिंग प्रदान करता है।
एक तरीका यह एन्कोडिंग से निपटने के लिए कैसे केवल उपयोग करने के लिए है string
अपने आवेदन और उपयोग में प्रकार TEncoding
हर बार जब आप विशिष्ट एन्कोडिंग का उपयोग करने की जरूरत है - आम तौर पर मैं / हे संचालन, DLL कॉल, आदि में ...
procedure EncodingExample;
var hello,response:string;
dataout,datain:TBytes;
expectedLength:integer;
stringStream:TStringStream;
stringList:TStringList;
begin
hello := 'Hello World!Привет мир!';
dataout := SysUtils.TEncoding.UTF8.GetBytes(hello); //Conversion to UTF8
datain := SomeIOFunction(dataout); //This function expects input as TBytes in UTF8 and returns output as UTF8 encoded TBytes.
response := SysUtils.TEncoding.UTF8.GetString(datain); //Convertsion from UTF8
//In case you need to send text via pointer and length using specific encoding (used mostly for DLL calls)
dataout := SysUtils.TEncoding.GetEncoding('ISO-8859-2').GetBytes(hello); //Conversion to ISO 8859-2
DLLCall(addr(dataout[0]),length(dataout));
//The same is for cases when you get text via pointer and length
expectedLength := DLLCallToGetDataLength();
setLength(datain,expectedLength);
DLLCall(addr(datain[0]),length(datain));
response := Sysutils.TEncoding.GetEncoding(1250).getString(datain);
//TStringStream and TStringList can use encoding for I/O operations
stringList:TStringList.create;
stringList.text := hello;
stringList.saveToFile('file.txt',SysUtils.TEncoding.Unicode);
stringList.destroy;
stringStream := TStringStream(hello,SysUtils.TEncoding.Unicode);
stringStream.saveToFile('file2.txt');
stringStream.Destroy;
end;