成员 |
函数原型 |
public: |
|
AnsiStringT |
AnsiStringT();
AnsiStringT(const char* src);
AnsiStringT(const AnsiStringT& src);
AnsiStringT(AnsiStringBase&& src);
AnsiStringT<CP>(const AnsiStringT<OTHER_CP>& src);
AnsiStringT(const char* src, int byteLen);
AnsiStringT(const wchar_t* src, int numwchar = -1);
AnsiStringT(const char16_t* src, int numChar16 = -1);
AnsiStringT(const char32_t* src, int numChar32 = -1);
AnsiStringT(char src);
AnsiStringT(System::WideChar src);
AnsiStringT(short src);
AnsiStringT(unsigned short src);
AnsiStringT(int src);
AnsiStringT(unsigned int src);
AnsiStringT(long src);
AnsiStringT(unsigned long src);
AnsiStringT(__int64 src);
AnsiStringT(unsigned __int64 src);
AnsiStringT(double src);
AnsiStringT(const WideString &src);
AnsiStringT(const UnicodeString &src);
构造函数 |
~AnsiStringT |
~AnsiStringT();
析构函数 |
operator = |
AnsiStringT &operator =(const AnsiStringT &rhs);
赋值操作符。【例:赋值及引用计数的测试】 |
operator + |
AnsiStringT operator +(const AnsiStringT &rhs) const;
字符串相加操作符,把两个字符串连接起来。
这个操作符不会改变两个相加的字符串的值,而是返回值为两个字符串连接在一起的字符串。 |
operator += |
AnsiStringT &operator +=(const AnsiStringT& rhs);
+= 操作符。 |
operator == |
bool operator ==(const AnsiStringT& rhs) const
判断相等,和 AnsiCompare 方法的返回值 == 0 的效果相同,规则请看 AnsiCompare 方法。 |
operator != |
bool operator !=(const AnsiStringT& rhs) const
判断不等,和 AnsiCompare 方法的返回值 != 0 的效果相同,规则请看 AnsiCompare 方法 |
operator < |
bool operator <(const AnsiStringT& rhs) const
判断小于,和 AnsiCompare 方法的返回值 < 0 的效果相同,规则请看 AnsiCompare 方法 |
operator > |
bool operator >(const AnsiStringT& rhs) const
判断大于,和 AnsiCompare 方法的返回值 > 0 的效果相同,规则请看 AnsiCompare 方法 |
operator <= |
bool operator <=(const AnsiStringT& rhs) const
判断小于等于,和 AnsiCompare 方法的返回值 <= 0 的效果相同,规则请看 AnsiCompare 方法 |
operator >= |
bool operator >=(const AnsiStringT& rhs) const
判断大于等于,和 AnsiCompare 方法的返回值 >= 0 的效果相同,规则请看 AnsiCompare 方法 |
AnsiCompare |
int AnsiCompare(const AnsiStringT &rhs) const;
比较字符串大小,s1.AnsiCompare(s2) 的结果
>0: s1>s2;
<0: s1<s2;
==0 s1==s2
比较字符串大小和本地语言相关,比如字母顺序、按照笔画数、按照拼音或注音的顺序等。
例如:相同的汉字,不同地区的笔画数可能不同,比如 “及” 大陆写法是 3 画,台湾写法是 4 画,读音的顺序也不同,大陆的拼音按照英文字母顺序 abcd (啊玻吃的),而台湾按照注音顺序 bpmf (玻破莫佛)。
默认的,根据操作系统控制面板里面的语言设定,大陆按照拼音对照英文字母 “啊玻吃的” 的顺序,台湾按照笔画数的顺序。如果要和控制面板的语言设定不同的顺序,需要用 Windows API 函数 CompareString |
AnsiCompareIC |
int AnsiCompareIC(const AnsiStringT &rhs) const;
比较字符串大小,忽略大小写,s1.AnsiCompareIC(s2) 的结果
>0: s1>s2;
<0: s1<s2;
==0 s1==s2
忽略大小写,其他规则与 AnsiCompare 方法相同。
大小写根据这个 ANSI 编码支持的 UNICODE 字符的属性,例如中国大陆 GBK 编码 (代码页 936) 支持英文字母、希腊字母和俄文字母的大小写转换。请参考 “大小写转换” 的内容。 |
AnsiPos |
int AnsiPos(const AnsiStringT &subStr) const;
查找 subStr 在字符串中出现的位置。AnsiPos 认为第一个字符的索引为 1,找不到 subStr 返回值为 0。
Pos 方法并不解析 MBCS 多字节字符,如果包含双字节字符 (例如:汉字),可能会因为 Trail Byte (后尾字节) 的取值范围为随意字符而引起找到错误的位置。如果是这种情况,需要使用 AnsiPos 方法。 |
c_str |
char *c_str() const;
返回字符串指针。如果字符串不空,返回内部数据 Data,如果字符串为空,Data 为 NULL,会返回一个空字符串。
不建议通过 c_str() 返回的字符指针修改字符串内容,只有 RefCount() 方法返回 1 的时候,通过这个指针修改字符串内容是安全的。测试程序:【例:赋值、数据指针、引用计数的测试】 |
data |
const void* data() const { return Data; }
返回字符串指针,这是字符串内部保存数据的指针,空字符串会返回 NULL。
不建议通过 data() 返回的指针修改字符串内容,只有 RefCount() 方法返回 1 的时候,通过这个指针修改字符串内容是安全的,测试程序:【例:赋值、数据指针、引用计数的测试】 |
LoadStr |
static AnsiStringT LoadStr(int ident);
static AnsiStringT LoadStr(HINSTANCE hInstance, int ident);
参数:从资源里面加载字符串,hInstance 为实例句柄,ident 为字符串的资源 ID,
返回值:从资源里面读出的字符串值 |
FmtLoadStr |
static AnsiStringT FmtLoadStr(int ident, const TVarRec *args, int size);
从资源里面加载字符串,ident 为资源 ID,加载的字符串作为 Format 函数的格式,args 和 size 作为 Format 函数的参数,返回把参数按照资源字符串格式的格式化的结果。 |
LoadString |
AnsiStringT &LoadString(HINSTANCE hInstance, int ident);
参数:从资源里面加载字符串到当前对象,hInstance 为实例句柄,ident 为字符串的资源 ID,
返回值:加载字符串到当前对象,然后返回当前对象的引用 (*this) |
StringOfChar |
static AnsiStringT StringOfChar(char ch, int count);
生成 count 个字符 ch 的字符串。 |
Format |
static AnsiStringT Format(const AnsiStringT& format, const TVarRec *args, int size);
实现 Delphi 样式的 Format 函数,例如:
int i = 5; double f = 1.356;
s = AnsiString::Format("i=%d, f=%.2f", ARRAYOFCONST((i,f)));
得到的字符串 s:"i=5, f=1.36" |
sprintf |
AnsiStringT &__cdecl sprintf(const char* format, ...);
把 printf 的格式输出结果输出到当前的字符串 this 里面,返回字符串引用 *this
例:s.sprintf("i=%d, f=%.2f", i, f); |
printf |
int __cdecl printf(const char* format, ...);
把 printf 的格式输出结果输出到当前的字符串 this 里面,返回字符串长度。
例:s.printf("i=%d, f=%.2f", i, f); |
cat_sprintf |
AnsiStringT &__cdecl cat_sprintf(const char* format, ...);
保留字符串原来的内容,把 sprintf 的格式输出结果添加在字符串的后面,返回字符串 *this 引用。 |
cat_printf |
int __cdecl cat_printf(const char* format, ...);
保留字符串原来的内容,把 printf 的格式输出结果添加在字符串的后面,返回字符串新增部分的长度。 |
vprintf |
int __cdecl vprintf(const char* format, va_list list);
把 vprintf 的格式输出结果输出到当前的字符串 this 里面,返回字符串长度。 |
cat_vprintf |
int __cdecl cat_vprintf(const char* format, va_list list);
保留字符串原来的内容,把 vprintf 的格式输出结果添加在字符串的后面,返回字符串新增部分的长度。 |
FormatFloat |
static AnsiStringT FormatFloat(const AnsiStringT &format,
const long double &value);
返回浮点数 value 按照规定的格式 format 生成的字符串 |
FloatToStrF |
static AnsiStringT FloatToStrF(long double value, TStringFloatFormat format, int precision, int digits);
返回浮点数 value 按照规定的格式 format 及精度 precision, digits 生成的字符串,codePage 为代码页。
格式 TStringFloatFormat 请参考 AnsiStringBase 类型成员里面的 TStringFloatFormat |
IntToHex |
static AnsiStringT IntToHex(int value, int digits);
把整数转为 16 进制字符串,生成的字符串至少 digits 位,不足前面补 0。 |
CurrToStr |
static AnsiStringT CurrToStr(const Currency& value);
金额值转字符串。 |
CurrToStrF |
static AnsiStringT CurrToStrF(const Currency& value, TStringFloatFormat format, int digits);
把金额值 value 按照 format 格式转为字符串,精度为 digits。
格式 TStringFloatFormat 请参考 AnsiStringBase 类型成员里面的 TStringFloatFormat |
Unique |
AnsiStringT& Unique();
让这个对象和其他共同引用同一个数据的对象脱离关系,如果和其他对象共用数据,会分配内存,把以前引用的数据复制过来,把以前引用的数据的引用计数 (RefCount) 减 1,让自身分配的数据的引用计数 (RefCount) 等于 1,返回值为 *this 的引用。调用这个方法之后,这个对象是它的数据的唯一一个拥有者。
【例:赋值、数据指针、引用计数的测试】 |
Insert |
AnsiStringT &Insert(const AnsiStringT& str, int index);
在字符串的 index 字符位置插入一个字符串 str,返回值为 *this 的引用。Insert 认为第一个字符的索引为 1。 |
Delete |
AnsiStringT &Delete(int index, int count);
从字符串的 index 字符位置开始删除 count 个字符,返回值为 *this 的引用。Delete 认为第一个字符的索引为 1。 |
SetLength |
AnsiStringT& SetLength(int newLength);
字符串的长度更改为 newLength,重新给字符串分配内存,字符串前面部分保留,多余部分的字符被删除,新增的字符值可能是随机数,返回值为 *this 的引用。如果在重新分配内存时内存不足,会抛出 EOutOfMemory 异常。 |
Pos |
int Pos(const AnsiStringT& subStr) const;
查找 subStr 在字符串中出现的位置。Pos 认为第一个字符的索引为 1,找不到 subStr 返回值为 0。
Pos 方法并不解析 MBCS 多字节字符,如果包含双字节字符 (例如:汉字),可能会因为 Trail Byte (后尾字节) 的取值范围为随意字符而引起找到错误的位置。如果是这种情况,需要使用 AnsiPos 方法。 |
LowerCase |
AnsiStringT LowerCase();
把字符串转为小写,函数返回新的字符串,原来的字符串并没有改变。
不仅仅限于英文,codePage 为代码页,例如中国大陆 GBK 编码 (代码页 936) 支持英文字母、希腊字母和俄文字母的大小写转换;而 UTF-8 编码 (代码页 65001) 支持所有的 UNICODE 字符。请参考 “大小写转换” 的内容。 |
UpperCase |
AnsiStringT UpperCase() const;
把字符串转为大写,函数返回新的字符串,原来的字符串并没有改变。
不仅仅限于英文,codePage 为代码页,例如中国大陆 GBK 编码 (代码页 936) 支持英文字母、希腊字母和俄文字母的大小写转换;而 UTF-8 编码 (代码页 65001) 支持所有的 UNICODE 字符。请参考 “大小写转换” 的内容。 |
Trim |
AnsiStringT Trim() const;
把字符串开头和末尾的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。 |
TrimLeft |
AnsiStringT TrimLeft() const;
把字符串开头的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。 |
TrimRight |
AnsiStringT TrimRight() const;
把字符串末尾的空格与控制符删掉,返回新的字符串,原来的字符串并没有改变。 |
SubString |
AnsiStringT SubString(int index, int count) const;
返回字符串当中从第 index 个字符开始的 count 个字符的字符串。 |
IsDelimiter |
bool IsDelimiter(const AnsiStringT& delimiters, int index) const;
返回字符串里面的第 index 个字符,是否也存在于字符串 delimiters 里面。例如:
s = "abcdefghijklmn";
s.IsDelimiter("aeiou",1) 为 true,因为 s 的第 1 个字符 'a' 是在字符串 "aeiou" 里面的字符
s.IsDelimiter("aeiou",2) 为 false,因为 s 的第 2 个字符 'b' 不在字符串 "aeiou" 里面
s.IsDelimiter("aeiou",5) 为 true,因为 s 的第 5 个字符 'e' 是在字符串 "aeiou" 里面的字符 |
LastDelimiter |
int LastDelimiter(const AnsiStringT& delimiters) const;
返回字符串里面最后一个字符是否存在于字符串 delimiters 里面。
请参考 IsDelimiter 方法。 |
WideCharBufSize |
int WideCharBufSize() const;
把字符串转为 wchar_t * 宽字符字符串需要多少个 wchar_t 字符,包括结束符,codePage 为代码页。
返回值为需要的字符个数。 |
WideChar |
wchar_t* WideChar(wchar_t* dest, int destSize) const;
把字符串转为 wchar_t * 宽字符字符串,dest 为转换之后的字符串存放的位置,destSize 为 dest 的大小 (wchar_t 字符个数,包括结束符),codePage 为代码页。返回值为 dest 参数。 |
ElementSize |
unsigned short ElementSize() const;
返回字符串里面每个元素的字节数,ANSI / UTF-8 / UTF-7 编码每个元素是 1 个字节的 (char)。 |
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;
返回字符串的代码页。 |
swap |
AnsiStringT &swap(AnsiStringT& other);
把字符串的内容和 other 字符串进行交换。
这个方法是通过数据指针交换来实现的,而不是拷贝数据,所以速度非常快,适合在排序等操作中交换字符串。 |
AnsiStringBase:: |
从 AnsiStringBase 继承过来的 |
operator [] |
char operator [](const int idx) const;
char& operator [](const int idx);
访问字符串里面的第 idx 个字符。
如果通过这个操作符修改字符串,会先调用 Unique 方法和其他字符串脱离引用关系,再进行修改。 |
Length |
int Length() const;
返回字符串长度,即字符串里面的 char 的个数,并不是真实的字符个数,因为可能有双字节字符或四字节字符。 |
IsEmpty |
bool IsEmpty() const { return Data == 0; }
字符串是否为空。true: 空,false: 非空。 |
ToInt |
int ToInt() const;
把字符串转为整数,如果转换失败,会抛出 EConvertError 异常。 |
ToIntDef |
int ToIntDef(int defaultValue) const;
把字符串转为整数,如果转换失败,返回 defaultValue 而不会抛出异常。 |
ToDouble |
double ToDouble() const;
把字符串转为浮点数,如果转换失败,抛出 EConvertError 异常。
支持把科学计数法 (L"-123.45e+67" 这样的格式) 转为浮点数,不支持 +INF, -INF 和 NAN。 |
IsPathDelimiter |
bool IsPathDelimiter(int index) const;
字符串里面的第 index 个字符,是否为文件路径的分割符。
Windows 的路径分割符为 '\\' 而其他系统的分割符为 '/' |
ByteType |
TStringMbcsByteType ByteType(int index) const;
返回字符串里面的第 index 个字符的字节类型。请参考 TStringMbcsByteType 类型。
【例1:双字节字符集 (DBCS) 的例子 - GBK 编码的例子】
【例2:多字节字符集 (MBCS) 的例子 - GB18030 编码的例子】 |
IsLeadByte |
bool IsLeadByte(int index) const;
字符串里面的第 index 个字符是 Lead Byte (前导字节)。请参考 TStringMbcsByteType 类型。
【例1:双字节字符集 (DBCS) 的例子 - GBK 编码的例子】
【例2:多字节字符集 (MBCS) 的例子 - GB18030 编码的例子】 |
IsTrailByte |
bool IsTrailByte(int index) const;
字符串里面的第 index 个字符是 Lead Byte (后尾字节)。请参考 TStringMbcsByteType 类型。
【例1:双字节字符集 (DBCS) 的例子 - GBK 编码的例子】
【例2:多字节字符集 (MBCS) 的例子 - GB18030 编码的例子】 |
AnsiLastChar |
char* AnsiLastChar() const;
返回字符串里面最后一个字符的位置。如果字符串里面的最后一个字符是 Trail Byte (后尾字节),由于后尾字节的取值范围可以是任何字符,直接根据取值范围可能会认为是单个字符,而 AnsiLastChar 方法会解析字符编码,返回真正的最后一个字符的位置,是单字节字符,或者双字节字符的第一个字节 Lead Byte (前导字节),而不会返回 Trail Byte (后尾字节) 的位置。 |
BytesOf |
DynamicArray<System::Byte> BytesOf() const;
把字符串转为 ANSI 本地编码的字符串,把字符串的内容放在 DynamicArray 数组里面返回。
如果要其他编码的 DynamicArray 数组,需要用 TEncoding 的 GetBytes 方法,例如:
DynamicArray<System::Byte> Bytes = TEncoding::UTF8->GetBytes(s); |
protected: |
|
AnsiStringBase:: |
从 AnsiStringBase 继承过来的 |
_AnsiCat |
static void _AnsiCat(AnsiStringBase &dst, const AnsiStringBase &src);
static void _AnsiCat(AnsiStringBase &dst, const AnsiStringBase &src1, const AnsiStringBase &src2);
AnsiStringBase 内部使用的方法。 |
_AnsiFromPWChar |
static void _AnsiFromPWChar(AnsiStringBase &dst, const WideChar *src, int len, int codePage);
AnsiStringBase 内部使用的方法。 |
ThrowIfOutOfRange |
void __cdecl ThrowIfOutOfRange(int idx) const;
检查字符索引 idx 是否有效。如果 idx 不在 1 到长度之间,会抛出 ERangeError 异常。字符串内部使用的方法。 |
GetRec |
const StrRec& GetRec() const;
StrRec& GetRec();
获取字符串的 StrRec 结构体。请参考 UnicodeString 类型成员里面的 StrRec。 |