主页C++ Builder 资料C++ Builder 编程技巧字符串及文字处理BCB6 程序升级到新版
C++ Builder 串口控件
C++ Builder 编程技巧
字符串及文字处理
 • 字符类型及字符编码
 • 各种 ANSI 编码
 • 各种 UNICODE 编码
 • 字符编码之间转换
 • 字符串处理
 • BCB6 程序升级到新版
多媒体处理
图片处理
文件处理
界面处理
C++ Builder 操作指南
C++ Builder 参考手册
网友留言/技术支持
C++ Builder 6.0 程序升级到 C++ Builder 2010 之后的版本,要修改些什么内容?
 • 新老版本到底有多大的区别?升级之后需要修改什么内容?
 • 升级之后的项目选择 UNICODE 版本,而不是 ANSI,头疼的事情反而会更少
 • 字符和字符串类型要改为 UNICODE 版本。
 • 与字符和字符串相关的函数都要改为 UNICODE 版本。

新老版本到底有多大的区别?升级之后需要修改什么内容?

新老版本最大的区别是字符编码,老版本是 ANSI 编码的,新版本的 UNICODE 编码的。
升级新版本之后,如果原先没有用到第三方控件,基本上就是修改字符编码,本文后面有详细介绍。
升级新版本之后,如果原先用到了第三方控件,还需要找到第三方控件的新版本。

 

升级之后的项目选择 UNICODE 版本,而不是 ANSI,头疼的事情反而会更少

项目选择 UNICODE 版本的方法请点击这里:选择 UNICODE / ANSI 版本 - C++ Builder 操作指南。

虽说 ANSI 版本是为了兼容老版本的程序设计的,但是新版本的 C++ Builder 字符串都改为了 UnicodeString 类型,这个类型和 ANSI 版本的 API 函数不匹配,导致了要修改的内容特别多,并且杂乱,为了调用 API 函数还要来回的转编码。

如果项目选择了 UNICODE 版本,只需要把所有的字符和字符串类型改为 UNICODE 版本就可以了,思路清晰,没有来回来去转编码的地方。

例如新版本的 Edit1->Text 属性,或者 Label1->Caption 属性,都是固定为 UnicodeString 类型的,不根据版本来变化,让他们匹配 UNICODE 版本的 Windows API 函数非常简单,只需要 .c_str() 就得到了 wchar_t *,而匹配 ANSI 版本的 Windows API 函数就需要转编码,增加了不必要的额外的代码。

 

字符和字符串类型要改为 UNICODE 版本。

以下是与字符和字符串相关的,需要更换的数据类型,完整的字符和字符串类型列表请参考 “字符类型及字符编码” 章节。

BCB6 等老版本的
ANSI/ASCII 版本类型
更换为新版本的
Unicode 宽字符版本类型
对应的兼容版本的类型
不必替换
类型说明
兼容版本会自动匹配 ANSI/ASCII 和 UNICODE 版本
'c' L'c' _T('c') 单引号的单个字符,
在单引号前面加上大写英文字母 L 变为宽字符。
"字符串" L"字符串" _T("字符串") 双引号的字符串,
在双引号前面加上大写英文字母 L 变为宽字符串。
char wchar_t _TCHAR 带下划线的 _TCHAR 是 C 语言库函数里面的
不带下划线的 TCHAR 是 Windows API 函数里面的
AnsiString UnicodeString String C++ Builder 的字符串类型,ANSI 版本的 String 对应 AnsiString,UNICODE 版本对应 UnicodeString
CHAR WCHAR TCHAR Windows API 函数里面的类型,他们分别对应
char, wchar_t 和 _TCHAR
LPSTR LPWSTR LPTSTR Windows API 函数里面的类型,他们分别对应
CHAR *, WCHAR * 和 TCHAR *
LPCSTR LPCWSTR LPCTSTR Windows API 函数里面的类型,他们分别对应
const CHAR *, const WCHAR * 和 const TCHAR *
std::string std::wstring   C++ 标准库里面的字符串类型,
如果用到了,也要改为宽字符版本的,才会和控件的属性匹配

 

与字符和字符串相关的函数都要改为 UNICODE 版本。

BCB6 等老版本的
ANSI/ASCII 版本函数
更换为新版本的
Unicode 宽字符版本函数
函数说明
新版的字符串都是 UnicodeString,对应的 C 或 API 函数需要用宽字符版本
strlen wcslen 计算字符串长度
strcpy wcscpy 拷贝字符串
strncpy wcsncpy 拷贝字符串,最多 n 个字符
stpcpy wcspcpy 拷贝字符串,返回指针指向目标字符串的结束符,返回值可以用来快速连接字符串
_stpcpy _wcspcpy 拷贝字符串,返回指针指向目标字符串的结束符,返回值可以用来快速连接字符串
strcat wcscat 把源字符串复制一份连接在目标字符串后面
strncat wcsncat 把源字符串复制一份连接在目标字符串后面,最多处理 n 个字符
strcmp wcscmp 字符串比较
strncmp wcsncmp 字符串比较,最多处理 n 个字符
stricmp _wcsicmp 字符串比较,忽略英文字母的大小写
strnicmp _wcsnicmp 字符串比较,忽略英文字母的大小写,最多处理 n 个字符
strchr wcschr 在字符串里面寻找一个字符,返回字符串里面第一个出现的字符
strrchr wcsrchr 在字符串里面寻找一个字符,返回字符串里面最后一个出现的字符,即从后往前找
strstr wcsstr 在字符串里面寻找另一个字符串
strset _wcsset 字符串里面所有的字符都改为同一个给定的字符
strnset _wcsnset 字符串里面所有的字符都改为同一个给定的字符,最多处理 n 个字符
strlwr _wcslwr 大写字母转为小写字母
_lstrlwr _lwcslwr 大写字母转为小写字母
strupr _wcsupr 小写字母转为大写字母
_lstrupr _lwcsupr 小写字母转为大写字母
strcoll wcscoll 比较两个字符串
stricoll _wcsicoll 比较两个字符串
strncoll _wcsncoll 比较两个字符串,只处理 n 个字符
strnicoll _wcsnicoll 比较两个字符串,忽略大小写,只处理 n 个字符
strxfrm wcsxfrm 把需要用 strcoll/wcscoll 比较的字符串转为可以用 strcmp/wcscmp 比较的形式
strcspn wcscspn 第一个字符串的前面有几个字符没有出现在第二个字符串里面。
找到出现在第二个字符串里面的字符就停止工作,返回前面的字符个数。
strdup _wcsdup 把字符串复制一份用,用完需要把复制的副本用 free() 函数释放占用的资源
strpbrk wcspbrk 返回的指针指向第一个字符串里面第一个出现在第二个字符串里面的字符
strrev _wcsrev 把字符串里面的字符改为反过来的顺序。
strspn wcsspn 返回第一个字符串里面的第一个不出现在第二个字符串里面的字符的位置
strtok wcstok 分割字符串,返回分割后的一个片段的指针,
需要循环调用这个函数,一直到没有更多的片段为止。
没有额外的分配和释放内存,这个函数是把源字符串修改了,返回里面片段的指针。
strerror _wcserror 把 C 语言的错误编码 errno 转为字符串,英文的错误提示信息。
_strerror __wcserror 把 C 语言的错误编码 errno 转为字符串,英文的错误提示信息。
strnlen_s wcsnlen_s safe 版本的 strnlen/wcsnlen
strerror_s _wcserror_s safe 版本的 strerror/_wcserror
strncpy_s wcsncpy_s safe 版本的 strncpy/wcsncpy
strcpy_s wcscpy_s safe 版本的 strcpy/wcscpy
strncat_s wcsncat_s safe 版本的 strncat/wcsncat
strcat_s wcscat_s safe 版本的 strcat/wcscat
strtok_s wcstok_s safe 版本的 strtok/wcstok
_argc _argc 系统全局变量,无论是控制台程序还是窗口程序,这个值都是命令行参数的个数,
对于参数个数,ANSI 和 UNICODE 版本是一样的
_argv _wargv 系统全局变量,无论是控制台程序还是窗口程序,这个值都指向命令行参数,
是字符指针数组,他们分别对应 ANSI 和 UNICODE 版本。
atof _wtof 字符串转 IEEE 双精度浮点数 (double)
_atold _wtold 字符串转 IEEE 长浮点数 (long double)
atoi _wtoi 字符串转整数 (int)
atol _wtol 字符串转 32 位长整数 (long)
_atoi64 _wtoi64 字符串转 64 位长长整数 (long long)
strtod wcstod 字符串转 IEEE 双精度浮点数 (double), 可以返回指向转换出错字符的指针
strtold wcstold 字符串转 IEEE 长浮点数 (long double), 可以返回指向转换出错字符的指针
strtol wcstol 字符串转 32 位长整数 (long), 支持 2 ~ 36 进位制
strtoll wcstoll 字符串转 64 位长长整数 (long long), 支持 2 ~ 36 进位制
strtoul wcstoul 字符串转 32 位无符号长整数 (unsigned long), 支持 2 ~ 36 进位制
strtoull wcstoull 字符串转无符号 64 位长长整数 (unsigned long long), 支持 2 ~ 36 进位制
itoa _itow 整数 (int) 转字符串,支持 2 ~ 36 进位制
ltoa _ltow 32 位长整数 (long) 转字符串,支持 2 ~ 36 进位制
ultoa _ultow 32 位无符号长整数 (unsigned long) 转字符串,支持 2 ~ 36 进位制
_i64toa _i64tow 64 位长长整数 (long long) 转字符串,支持 2 ~ 36 进位制
_ui64toa _ui64tow 无符号 64 位长长整数 (unsigned long long) 转字符串,支持 2 ~ 36 进位制
ecvt   把一个浮点数转为指定长度的无符号整数字符串,不足补零,
并且返回小数点位置和是否有负号。
fcvt   把一个浮点数转为一个无符号整数字符串,保证小数点后面保留指定个数字,
不足补零,并且返回小数点位置和是否有负号。
gcvt   把一个浮点数转成字符串,指定要保留几位有效数字,小数方式或科学计数法,
当这些位有效数字无法用小数方式表达时,会变成科学计数法。
system _wsystem 执行一条控制台命令,如果这不是控制台程序,也会自动开启一个控制台执行
_popen _wpopen 打开一个管道 (pipe) 来执行一条控制台命令,可以透过返回的 FILE * 来读写控制台命令执行的输出和输入。
getenv _wgetenv 获取一个操作系统环境变量
putenv _wputenv 修改一个操作系统环境变量,只是针对当前进程有效
sprintf swprintf 格式化数据,输出到字符串里面。
snprintf snwprintf 格式化数据,输出到字符串里面,限制输出的缓存大小为 n 个字符。
vsprintf vswprintf 格式化 va_list 数据,输出到字符串里面
vsnprintf vsnwprintf 格式化 va_list 数据,输出到字符串里面,限制输出的缓存大小为 n 个字符。
_vsnprintf _vsnwprintf 格式化 va_list 数据,输出到字符串里面,限制输出的缓存大小为 n 个字符。
fopen _wfopen 打开或创建一个文件,返回 FILE *
_fsopen _wfsopen 打开或创建一个文件,可以指定文件的共享方式,返回 FILE *
open _wopen 打开或创建一个文件,返回文件的句柄
_sopen _wsopen 打开或创建一个文件,可以指定文件的共享方式,返回文件的句柄
fgetc fgetwc 从文件里面读取一个字符
fgets fgetws 从文件里面读取一行文字
fprintf fwprintf 格式化数据,输出到文件
fscanf fwscanf 从文件里面按照格式读取数据
remove _wremove 删除一个文件
rename _wrename 给文件改名
chmod _wchmod 修改文件的可读写属性
mkdir _wmkdir 创建一个文件夹
rmdir _wrmdir 删除一个空文件夹,并且这个文件夹不能是当前进程的当前工作文件夹
findfirst _wfindfirst 寻找第一个匹配指定规则的文件
findnext _wfindnext 寻找下一个匹配指定规则的文件
findclose _wfindclose 停止寻找匹配的文件,释放占用的资源
fnsplit _wfnsplit 把一个文件名分解为驱动器、路径、文件名、扩展名几个部分
fnmerge _wfnmerge 把驱动器、路径、文件名和扩展名合在一起变成一个完整路径
getcwd _wgetcwd 获取当前工作路径
getcurdir_wgetcurdir 获取某个驱动器的当前路径
◤上一页:字符串处理

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