主页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 简介

UnicodeString: 编码为 UTF-16 的字符串,C++ Builder 里面最常用的字符串类型

 

UnicodeString 成员

属性方法事件类型数据

 

头文件:

#include <System.hpp>

 

命名空间:

System

 

继承关系:

 

例:赋值、数据指针、引用计数的测试

通过这个测试程序:
 • 测试赋值及引用计数;
 • 理解 “不建议通过 c_str()、w_str() 和 data() 返回的指针修改字符串内容”;
 • 测试 Unique 方法的作用。
 • 赋值的时候,只是让两个字符串共有同一个数据,把引用计数增加,这样会以最快的速度处理字符串。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  UnicodeString s1 = L"你好?";
  UnicodeString s2 = s1;
  UnicodeString s3 = L"Victor";

  s3 = s1;

  Memo1->Lines->Add(L"把三个字符串 s1, s2, s3 互相赋值为相等的字符串:\r\n");

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);

  UnicodeString s;
  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));


  Memo1->Lines->Add(L"\r\n通过 s2.c_str() 返回的指针修改了字符串 s2:\r\n");

  wchar_t *p = s2.c_str();
  p[2] = L'啊';

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);

  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));

  Memo1->Lines->Add(L"\r\n通过 s2 的 [] 操作符修改字符串:\r\n");

  s2[3] = L'!';

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);

  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  UnicodeString s1 = L"你好?";
  UnicodeString s2 = s1;
  UnicodeString s3 = L"Victor";

  s3 = s1;

  Memo1->Lines->Add(L"把三个字符串 s1, s2, s3 互相赋值为相等的字符串:\r\n");

  UnicodeString s;
  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);
  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));

  Memo1->Lines->Add(L"\r\n调用 s2.Unique() 让 s2 成为唯一一个拥有这个字符串的实例\r\n");

  s2.Unique();

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);
  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));

  Memo1->Lines->Add(L"\r\n通过 s2.c_str() 返回的指针修改了字符串 s2:\r\n");

  wchar_t *p = s2.c_str();
  p[2] = L'啊';

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);

  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));

  Memo1->Lines->Add(L"\r\n通过 s2 的 [] 操作符修改字符串:\r\n");

  s2[3] = L'!';

  Memo1->Lines->Add(L"s1 = " + s1);
  Memo1->Lines->Add(L"s2 = " + s2);
  Memo1->Lines->Add(L"s3 = " + s3);

  Memo1->Lines->Add(s.sprintf(L"s1.c_str()=%p, s1.RefCount()=%d", s1.c_str(), s1.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s2.c_str()=%p, s2.RefCount()=%d", s2.c_str(), s2.RefCount()));
  Memo1->Lines->Add(s.sprintf(L"s3.c_str()=%p, s3.RefCount()=%d", s3.c_str(), s3.RefCount()));
}
//---------------------------------------------------------------------------

 

相关链接:

 • UnicodeString 编码与编码转换
   · 字符类型 - UnicodeCategory
   · 字符个数和字节数
   · 判断字符串里面的字符是双字节字符或是四字节字符
     获取字符串长度、字符个数、每个字符的类型
   · 判断字符串里面的字符是汉字或是英文
     判断字符串里面的字符是否为汉字,获取汉字的 CJK 分组,计算代理对的 UNICODE 编码值
     获取字符串里面汉字的个数和第几个字符是汉字:
     获取字符串里面的汉字所在的 CJK 分组
   · 编码转换:UTF-8,UTF-16,UTF-32,ANSI,GBK/GB2312,BIG5,……
     UnicodeString 和 std::string, std::wstring 之间的转换,让 std::string 支持 UTF-8 或其他编码
   · 获取字符串或字符的 ANSI 代码页列表
 • 大小写转换
 • 分割字符串,利用字符串里面包含的字符或字符串拆分字符串
 • 字符串相加,几个字符串连接在一起
 • 截取字符串的一部分,把字符串前面或/和后面的空格删掉,把字符串当中的一部分删掉
 • 把字符串里面的某个内容替换为另一个内容
 • 字符串和整数、浮点数、日期时间之间的转换
   · 字符串和整数之间的转换,进位制转换
   · 字符串和枚举型之间的转换
   · 字符串和浮点数之间的转换,小数点位数、千分位分割、科学计数法
   · 字符串和日期时间之间的转换,日期时间的格式
 • 格式化输出到字符串

下一页:UTF8String

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