主页C++ Builder 资料C++ Builder 参考手册System 字符串UnicodeString
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
System 字符串
 • UnicodeString
   · 方法
   · 类型
   · 数据
 • UTF8String
 • TStringList
 • TStrings
 • String
 • AnsiString
 • AnsiStringBase
 • AnsiStringT
 • RawByteString
 • UCS4String
 • WideString
 • EnumToStr
 • FloatToStr
 • FloatToStrF
 • FormatFloat
 • IntToStr
 • UIntToStr
 • IntToHex
 • StrToEnum
 • StrToFloat
 • StrToFloatDef
 • StrToInt
 • StrToIntDef
 • StrToInt64
 • StrToInt64Def
 • StrToUInt64
 • StrToUInt64Def
 • TFloatFormat
 • GetUnicodeCategory
 • IMLangCodePages
 • StringReplace
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
UnicodeString - 编码为 UTF-16 的字符串,C++ Builder 里面最常用的字符串类型

属性方法事件类型数据返回 UnicodeString 类

方法 描述
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 *,请先转为所需的编码的字符串,例如 UTF8StringAnsiString、或 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,可以为以下值:
ctNotLeadChar 这是单个 char16_t 字符,不是 UTF-16 编码代理对 (surrogate pair) 字符。
ctbLeadSurrogate 这是 UTF-16 编码的代理对当中的前导代理 (lead surrogate)
ctTrailSurrogate 这是 UTF-16 编码的代理对当中的后尾代理 (trail surrogate)
例:获取字符串长度、字符个数、每个字符的类型
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

 

全局操作符:

全局操作符 描述
System: 在 System 命名空间里面
operator + UnicodeString operator +(const char *, const UnicodeString &rhs);
UnicodeString operator +(const wchar_t *, const UnicodeString &rhs);
UnicodeString operator +(const char16_t *, const UnicodeString &rhs);
UnicodeString operator +(const char32_t *, const UnicodeString &rhs);
char *, wchar_t *, char16_t *, char32_t * 和 UnicodeString 相加,返回相加之后的字符串。
例如:s2 = L"abc" + s1;
operator << std::wostream &operator << (std::wostream &os, const UnicodeString &arg);
输出到 std::wostream,例如:
UnicodeString s = L"abc"; std::wcout << s;
operator >> std::wistream &operator >> (std::wistream &is, UnicodeString &arg);
从 std::wistream 里面输入字符串,例如:
UnicodeString s; std::wcin >> s;

属性方法事件类型数据返回 UnicodeString 类

下一页:类型

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号