方法 |
描述 |
public: |
|
UnicodeString |
UnicodeString(): Data(0) {}
UnicodeString(const char* src);
UnicodeString(const UnicodeString& src);
UnicodeString(const WideChar* src, int len);
UnicodeString(const char* src, int len);
UnicodeString(const WideChar* src);
UnicodeString(const char16_t* src, int numChar16 = -1);
UnicodeString(const char32_t* src, int numChar32 = -1);
UnicodeString(char src): Data(0) { sprintf(L"%c", src);}
UnicodeString(System::WideChar src): Data(0) { SetLength(1)[1] = src; }
UnicodeString(short src): Data(0) { sprintf(L"%hd", src); }
UnicodeString(unsigned short src): Data(0) { sprintf(L"%hu", src); }
UnicodeString(int src): Data(0) { sprintf(L"%i", src); }
UnicodeString(unsigned int src): Data(0) { sprintf(L"%u", src); }
UnicodeString(long src): Data(0) { sprintf(L"%ld", src); }
UnicodeString(unsigned long src): Data(0) { sprintf(L"%lu", src); }
UnicodeString(__int64 src): Data(0) { sprintf(L"%lli", src); }
UnicodeString(unsigned __int64 src): Data(0) { sprintf(L"%llu", src); }
UnicodeString(double src);
UnicodeString(const WideString &src);
template <unsigned short codePage>
UnicodeString(const AnsiStringT<codePage> &src): Data(0) {
System::Internal::Strhlpr::UnicodeFromAnsi(*this, *PRawByteString(&src));
}
构造函数 |
~UnicodeString |
~UnicodeString();
析构函数 |
LoadStr |
static UnicodeString LoadStr(int ident);
static UnicodeString LoadStr(HINSTANCE hInstance, int ident);
从资源里面加载字符串,hInstance 为实例句柄,ident 为字符串的资源 ID
例:s = UnicodeString::LoadStr(HInstance, 100); |
FmtLoadStr |
static UnicodeString FmtLoadStr(int ident, const TVarRec *args, int size);
从资源里面加载字符串,ident 为资源 ID,加载的字符串作为 Format 函数的格式,args 和 size 作为 Format 函数的参数,返回把参数按照资源字符串格式的格式化的结果。
例:s = UnicodeString::FmtLoadStr(101, ARRAYOFCONST((i,L"a",x,2.0))); |
LoadString |
UnicodeString &LoadString(HINSTANCE hInstance, int ident);
从资源里面加载字符串到当前对象,hInstance 为实例句柄,ident 为字符串的资源 ID,
返回值为当前对象的引用 (*this) |
StringOfChar |
static UnicodeString StringOfChar(WideChar ch, int count);
生成 count 个字符 ch 的字符串。
例:s = UnicodeString::StringOfChar(L'呵',5); 得到的字符串是 L"呵呵呵呵呵" |
Format |
static UnicodeString Format(const UnicodeString &format, const TVarRec *args, int size);
实现 Delphi 样式的 Format 函数,例如:
int i = 5; double f = 1.356;
s = UnicodeString::Format(L"i=%d, f=%.2f", ARRAYOFCONST((i,f)));
得到的字符串 s:L"i=5, f=1.36" |
sprintf |
UnicodeString &__cdecl sprintf(const wchar_t *format, ...);
把 printf 的格式输出结果输出到当前的字符串 this 里面,返回字符串引用 *this
例:s.sprintf(L"i=%d, f=%.2f", i, f); |
printf |
int __cdecl printf(const wchar_t* format, ...);
把 printf 的格式输出结果输出到当前的字符串 this 里面,返回字符串长度。
例:s.printf(L"i=%d, f=%.2f", i, f); |
vprintf |
int __cdecl vprintf(const wchar_t *format, va_list);
把 vprintf 的格式输出结果输出到当前的字符串 this 里面,返回字符串长度。
【例:格式化输出到字符串】 |
cat_sprintf |
UnicodeString &__cdecl cat_sprintf(const wchar_t* format, ...);
保留字符串原来的内容,把 sprintf 的格式输出结果添加在字符串的后面,返回字符串 *this 引用。
【例:格式化输出到字符串】 |
cat_printf |
int __cdecl cat_printf(const wchar_t* format, ...);
保留字符串原来的内容,把 printf 的格式输出结果添加在字符串的后面,返回字符串新增部分的长度。
【例:格式化输出到字符串】 |
cat_vprintf |
int __cdecl cat_vprintf(const wchar_t* format, va_list);
保留字符串原来的内容,把 vprintf 的格式输出结果添加在字符串的后面,返回字符串新增部分的长度。
【例:格式化输出到字符串】 |
FormatFloat |
static UnicodeString FormatFloat(const UnicodeString &format,
const long double &value);
返回浮点数 value 按照规定的格式 format 生成的字符串。例:
f = 12345678.9876;
s = UnicodeString::FormatFloat(L"#,##0.00", f);
得到的字符串 s 为 L"12,345,678.99" |
FloatToStrF |
static UnicodeString FloatToStrF(long double value,
TStringFloatFormat format,
int precision, int digits);
返回浮点数 value 按照规定的格式 format 及精度 precision, digits 生成的字符串。
格式 TStringFloatFormat 请参考 UnicodeString 类型成员里面的 TStringFloatFormat。 |
IntToHex |
static UnicodeString IntToHex(int value, int digits);
把整数转为 16 进制字符串,生成的字符串至少 digits 位,不足前面补 0。
例如:i = 1234;
s = UnicodeString::IntToHex(i,4); 得到的字符串为 L"04D2" 不足 4 位前面补 0
i = 1234567890; s = UnicodeString::IntToHex(i,4); 得到的字符串为 L"499602D2" 超过 4 位直接输出 |
CurrToStr |
static UnicodeString CurrToStr(Currency value);
金额值转字符串。 |
CurrToStrF |
static UnicodeString CurrToStrF(Currency value,
TStringFloatFormat format,
int digits);
把金额值 value 按照 format 格式转为字符串,精度为 digits。
格式 TStringFloatFormat 请参考 UnicodeString 类型成员里面的 TStringFloatFormat。 |
operator = |
UnicodeString &operator =(const UnicodeString &rhs);
赋值操作符。【例:赋值及引用计数的测试】 |
operator += |
UnicodeString &operator +=(const UnicodeString &rhs);
+= 操作符。 |
operator == |
bool operator ==(const UnicodeString &rhs) const;
判断相等操作符,和 Compare 的返回值 == 0 的效果相同,规则请看 Compare 方法。 |
operator != |
bool operator !=(const UnicodeString &rhs) const;
判断不等操作符,和 Compare 的返回值 != 0 的效果相同,规则请看 Compare 方法。 |
operator < |
bool operator < (const UnicodeString &rhs) const;
判断小于操作符,和 Compare 的返回值 < 0 的效果相同,规则请看 Compare 方法。 |
operator > |
bool operator > (const UnicodeString &rhs) const;
判断大于操作符,和 Compare 的返回值 > 0 的效果相同,规则请看 Compare 方法。 |
operator <= |
bool operator <=(const UnicodeString &rhs) const;
判断小于等于操作符,和 Compare 的返回值 <= 0 的效果相同,规则请看 Compare 方法。 |
operator >= |
bool operator >=(const UnicodeString &rhs) const;
判断大于等于操作符,和 Compare 的返回值 >= 0 的效果相同,规则请看 Compare 方法。 |
Compare |
int Compare(const UnicodeString &rhs) const;
比较字符串大小,s1.Compare(s2) 的结果
>0: s1>s2;
<0: s1<s2;
==0 s1==s2
比较字符串大小和本地语言相关,比如字母顺序、按照笔画数、按照拼音或注音的顺序等。
例如:相同的汉字,不同地区的笔画数可能不同,比如 “及” 大陆写法是 3 画,台湾写法是 4 画,读音的顺序也不同,大陆的拼音按照英文字母顺序 abcd (啊玻吃的),而台湾按照注音顺序 bpmf (玻破莫佛)。
默认的,根据操作系统控制面板里面的语言设定,大陆按照拼音对照英文字母 “啊玻吃的” 的顺序,台湾按照笔画数的顺序。如果要和控制面板的语言设定不同的顺序,需要用 Windows API 函数 CompareString |
CompareIC |
int CompareIC(const UnicodeString &rhs) const;
比较字符串大小,忽略大小写,s1.CompareIC(s2) 的结果
>0: s1>s2;
<0: s1<s2;
==0 s1==s2
忽略大小写,其他规则与 Compare 方法相同。
大小写根据 UNICODE 字符的属性,请参考 “大小写转换” 的内容。 |
operator [] |
WideChar operator [](const int idx) const;
WideChar &operator [](const int idx);
访问字符串里面的第 idx 个字符。
如果通过这个操作符修改字符串,会先调用 Unique 方法和其他字符串脱离引用关系,再进行修改。 |
operator + |
UnicodeString operator +(const UnicodeString& rhs) const;
字符串相加操作符,把两个字符串连接起来。
这个操作符不会改变两个相加的字符串的值,而是返回值为两个字符串连接在一起的字符串。 |
c_str |
WideChar *c_str() const { return (Data)? Data: const_cast<WideChar*>(L"");}
返回 wchar_t * 字符串指针。空字符串会返回一个空字符串指针,而不是 NULL。
不建议通过 c_str() 返回的字符指针修改字符串内容,只有 RefCount() 方法返回 1 的时候,通过这个指针修改字符串内容是安全的。测试程序:【例:赋值、数据指针、引用计数的测试】 |
w_str |
WideChar *w_str() const { return (Data)? Data: const_cast<WideChar*>(L"");}
返回 wchar_t * 字符串指针。空字符串会返回一个空字符串指针,而不是 NULL。
不建议通过 w_str() 返回的字符指针修改字符串内容,只有 RefCount() 方法返回 1 的时候,通过这个指针修改字符串内容是安全的。测试程序:【例:赋值、数据指针、引用计数的测试】 |
t_str |
WideChar *t_str _DEPRECATED_ATTRIBUTE0 () const { return (Data)? Data: const_cast<WideChar*>(_D(""));}
过时的方法,如果需要转为 char *,请先转为所需的编码的字符串,例如 UTF8String、AnsiString、或 AnsiStringT<CP> 等,再用它们的 .c_str() 方法获取对应字符编码 (例如 UTF-8, ANSI, CP代码页) 的 char * 。 |
data |
const void* data() const { return Data; }
返回字符串指针,这是字符串内部保存数据的指针,空字符串会返回 NULL。
不建议通过 data() 返回的指针修改字符串内容,只有 RefCount() 方法返回 1 的时候,通过这个指针修改字符串内容是安全的,测试程序:【例:赋值、数据指针、引用计数的测试】 |
Length |
int Length() const;
返回字符串长度,即字符串里面的 wchar_t (或 char16_t) 的个数,并不是真实的 UNICODE 字符个数。 |
IsEmpty |
bool IsEmpty() const { return Data == 0; }
字符串是否为空。true: 空,false: 非空。 |
Unique |
UnicodeString &Unique();
让这个对象和其他共同引用同一个数据的对象脱离关系,如果和其他对象共用数据,会分配内存,把以前引用的数据复制过来,把以前引用的数据的引用计数 (RefCount) 减 1,让自身分配的数据的引用计数 (RefCount) 等于 1,返回值为 *this 的引用。调用这个方法之后,这个对象是它的数据的唯一一个拥有者。
【例:赋值、数据指针、引用计数的测试】 |
Insert |
UnicodeString &Insert(const UnicodeString& str, int index);
在字符串的 index 字符位置插入一个字符串 str,返回值为 *this 的引用。Insert 认为第一个字符的索引为 1。
【例:在字符串中间加入字符串】 |
Delete |
UnicodeString &Delete(int index, int count);
从字符串的 index 字符位置开始删除 count 个字符,返回值为 *this 的引用。Delete 认为第一个字符的索引为 1。
【例:删除字符串中间的一部分】 |
SetLength |
UnicodeString &SetLength(int newLength);
字符串的长度更改为 newLength,重新给字符串分配内存,字符串前面部分保留,多余部分的字符被删除,新增的字符值可能是随机数,返回值为 *this 的引用。如果在重新分配内存时内存不足,会抛出 EOutOfMemory 异常。 |
Pos |
int Pos(const UnicodeString &subStr) const;
查找 subStr 在字符串中出现的位置。Pos 认为第一个字符的索引为 1,找不到 subStr 返回值为 0。 |
LowerCase |
UnicodeString LowerCase() const;
把字符串转为小写,函数返回新的字符串,原来的字符串并没有改变,例如:
s = L"ABCΩΠĀÁǍÀ";
s = s.LowerCase();
得到是字符串为 L"abcωπāáǎà" |
UpperCase |
UnicodeString UpperCase() const;
把字符串转为大写,函数返回新的字符串,原来的字符串并没有改变,例如:
s = L"abcωπāáǎà";
s = s.UpperCase();
得到是字符串为 L"ABCΩΠĀÁǍÀ"; |
Trim |
UnicodeString Trim() const;
把字符串开头和末尾的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。【例:删除首尾空格】 |
TrimLeft |
UnicodeString TrimLeft() const;
把字符串开头的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。【例:删除首尾空格】 |
TrimRight |
UnicodeString TrimRight() const;
把字符串末尾的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。【例:删除首尾空格】 |
SubString |
UnicodeString SubString(int index, int count) const;
返回字符串当中从第 index 个字符开始的 count 个字符的字符串。【例:截取字符串的一部分】 |
ToInt |
int ToInt() const;
把字符串转为整数,如果转换失败,会抛出 EConvertError 异常。 |
ToIntDef |
int ToIntDef(int defaultValue) const;
把字符串转为整数,如果转换失败,返回 defaultValue 而不会抛出异常。 |
ToDouble |
double ToDouble() const;
把字符串转为浮点数,如果转换失败,抛出 EConvertError 异常。
支持把科学计数法 (L"-123.45e+67" 这样的格式) 转为浮点数,不支持 +INF, -INF 和 NAN。
更多的浮点数转换,请参考 “字符串和浮点数之间的转换” |
IsDelimiter |
bool IsDelimiter(const UnicodeString &delimiters, int index) const;
返回字符串里面的第 index 个字符,是否也存在于字符串 delimiters 里面。例如:
s = L"abcdefghijklmn";
s.IsDelimiter(L"aeiou",1) 为 true,因为 s 的第 1 个字符 L'a' 是在字符串 L"aeiou" 里面的字符
s.IsDelimiter(L"aeiou",2) 为 false,因为 s 的第 2 个字符 L'b' 不在字符串 L"aeiou" 里面
s.IsDelimiter(L"aeiou",5) 为 true,因为 s 的第 5 个字符 L'e' 是在字符串 L"aeiou" 里面的字符 |
IsPathDelimiter |
bool IsPathDelimiter(int index) const;
字符串里面的第 index 个字符,是否为文件路径的分割符。
Windows 的路径分割符为 L'\\' 而其他系统的分割符为 L'/' |
LastDelimiter |
int LastDelimiter(const UnicodeString &delimiters) const;
返回字符串里面最后一个字符是否存在于字符串 delimiters 里面。
请参考 IsDelimiter 方法。 |
FirstChar |
const WideChar* FirstChar() const;
WideChar* FirstChar();
返回字符串里面第一个字符的指针。请参考 begin 方法。 |
LastChar |
const WideChar* LastChar() const;
WideChar* LastChar();
返回字符串里面最后一个字符的指针。请参考 end 方法。 |
begin |
iterator begin() { return FirstChar(); }
const_iterator begin() const { return cbegin(); }
返回字符串里面第一个字符的指针,例如:
for(UnicodeString::iterator it=s.begin(); it<s.end(); it++)
{
wchar_t c = *it;
Memo1->Lines->Add(c);
} |
end |
iterator end() {
WideChar* chr = LastChar();
return chr ? chr + 1 : 0;
}
const_iterator end() const { return cend(); }
返回字符串里面最后一个字符的指针,例如:
for(UnicodeString::iterator it=s.begin(); it<s.end(); it++)
{
wchar_t c = *it;
Memo1->Lines->Add(c);
} |
cbegin |
const_iterator cbegin() const { return FirstChar(); }
返回字符串里面第一个字符的指针。请参考 begin 方法。 |
cend |
const_iterator cend() const {
const WideChar* chr = LastChar();
return chr ? chr + 1 : 0;
}
返回字符串里面最后一个字符的指针。请参考 end 方法。 |
ByteType |
TStringLeadCharType ByteType(int index) const;
返回字符串里面第 index 个字符的类型,请参考类型 TStringLeadCharType,可以为以下值:
【例:获取字符串长度、字符个数、每个字符的类型】 |
IsLeadSurrogate |
bool IsLeadSurrogate(int index) const;
字符串里面的第 index 个字符是否为前导代理 (lead surrogate) |
IsTrailSurrogate |
bool IsTrailSurrogate(int index) const;
字符串里面的第 index 个字符是否为后尾代理 (trail surrogate) |
BytesOf |
DynamicArray<System::Byte> BytesOf() const;
把字符串转为 ANSI 本地编码的字符串,把字符串的内容放在 DynamicArray 数组里面返回。
如果要其他编码的 DynamicArray 数组,需要用 TEncoding 的 GetBytes 方法,例如:
DynamicArray<System::Byte> Bytes = TEncoding::UTF8->GetBytes(s); |
ElementSize |
unsigned short ElementSize() const;
返回字符串里面每个元素的字节数,UnicodeString 里面每个元素是 2 个字节的 (char16_t)。 |
RefCount |
int RefCount() const;
返回字符串数据的引用计数,空字符串返回 0。
返回值 = 0: 没有数据,c_str 和 w_str 方法返回的空字符串并不是这个字符串的数据,这个字符串的内部数据是 NULL,
返回值 = 1: 这个字符串是这个字符串数据的唯一拥有者,可以通过 c_str 和 w_str 返回的指针修改数据,
返回值 ≥ 2: 和其他字符串共有数据,这是共有数据的字符串的个数,如果通过 c_str 或 w_str 指针修改了数据,这些 (一共 RefCount() 个) 字符串的内容会同时被修改了。【例:赋值、数据指针、引用计数的测试】 |
CodePage |
unsigned short CodePage() const;
返回字符串的代码页,UTF-16 编码的代码页为 1200。 |
swap |
UnicodeString &swap(UnicodeString &other);
把字符串的内容和 other 字符串进行交换。
这个方法是通过数据指针交换来实现的,而不是拷贝数据,所以速度非常快,适合在排序等操作中交换字符串。
UnicodeString s1 = L"你好";
UnicodeString s2 = L"Victor Chen";
s1.swap(s2);
Memo1->Lines->Add(s1); // Victor Chen
Memo1->Lines->Add(s2); // 你好
运行结果为:
Victor Chen
你好 |
protected: |
|
ThrowIfOutOfRange |
void __cdecl ThrowIfOutOfRange(int idx) const;
检查字符索引 idx 是否有效。如果 idx 不在 1 到长度之间,会抛出 ERangeError 异常。字符串内部使用的方法。 |
GetRec |
const StrRec& GetRec() const;
StrRec& GetRec();
获取字符串的 StrRec 结构体。请参考 UnicodeString 类型成员里面的 StrRec。 |