wctrans_t wctrans (const char* transformation);
wctrans() 函数用来获得一个标量类型的字符转换。
一个宽字符可以是大写字母、小写字母、十进制数字、空白符、可打印字符等不同的分类,其中大写字母和小写字母之间可以相互转换。
C语言支持全球的语言系统,可以处理英文、中文、日文、韩文、德语、法语、拉丁文、希腊文等。在英文以外的语言环境中,可能会包含更多的字符转换,例如日语中还有平假名、片假名、汉字之间的转换。
我们可以通过 setlocale() 函数进行地域设置,改变程序的语言环境,让程序使用 ASCII 以外的字符集,例如 GBK(简体中文)、BIG5(繁体中文)、Shift-JIS(日文)、Unicode(世界统一码) 等。
我们可以用文本(字符串)来描述字符的转换,也可以用标量(一般是整数)来描述字符的转换,文本和标量是一一对应的。就像班级里的学生,我们可以喊他的名字(文本),也可以喊他的学号(标量),这两种方式都能够找到唯一的学生。
例如,可以用"toupper"这段文本来表示转换为大写字母,还可以用100这个整数来表示转换为大写字母,此时"toupper"和100就是对应的。
对于用户来说,文本比标量更加直观,更加容易记忆;对于编程语言来说,标量比文本更加容易处理,计算机底层都是整数。
标量和文本之间往往没有明确的关联,并且标量的值可能会随着不同的库实现、不同的区域设置而变化,要想让用户记住标量的值是不现实的。这样一来就必须提供一个函数,让用户可以通过这个函数获取文本对应的标量,wctrans() 就是干这件事的:我们可以给 wctrans() 传递一个用文本表示的字符转换,它会返回一个用标量表示的字符转换。
C语言标准规定,无论在哪种区域设置下,无论在哪种语言环境下,都必须至少包含以下两种转换形式:
字符转换 | 说 明 | 对应的字符转换函数 |
---|---|---|
"tolower" | 转换为小写字母 | towlower |
"toupper" | 转换为大写字母 | towupper |
返回一个标量形式(wctrans_t 类型)的字符转换。
文本所对应的标量值不是固定的,它可能会随着不同的库实现、不同的区域设置而变化,所以不能直接使用一个固定的标量值,或者猜测标量值,而应该坚持使用 wctrans() 函数来获取对应的标量值。
判断宽字符串中的字符是否是小写字母,如何是,那么转换成大写字母。
#include <stdio.h>
#include <wctype.h>
int main ()
{
int i=0;
wchar_t str[] = L"C C++ Java Python\n";
wchar_t c;
wctype_t check = wctype("lower");
wctrans_t trans = wctrans("toupper");
while (str[i])
{
c = str[i];
if (iswctype(c,check)) c = towctrans(c,trans);
putwchar (c);
i++;
}
return 0;
}
运行结果: