虽说 ANSI 版本是为了兼容老版本的程序设计的,但是新版本的 C++ Builder 字符串都改为了 UnicodeString 类型,这个类型和 ANSI 版本的 API 函数不匹配,导致了要修改的内容特别多,并且杂乱,为了调用 API 函数还要来回的转编码。
例如新版本的 Edit1->Text 属性,或者 Label1->Caption 属性,都是固定为 UnicodeString 类型的,不根据版本来变化,让他们匹配 UNICODE 版本的 Windows API 函数非常简单,只需要 .c_str() 就得到了 wchar_t *,而匹配 ANSI 版本的 Windows API 函数就需要转编码,增加了不必要的额外的代码。
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++ 标准库里面的字符串类型,
如果用到了,也要改为宽字符版本的,才会和控件的属性匹配 |
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 |
获取某个驱动器的当前路径 |