以前的MFC工程,字符集都是基于多字节的,而现在这个工程,无意间使用unicode字符集,在其过程中,有诸多函数使用不同于以前。当然,建立项目后也是可以在项目属性中修改字符集的。这篇文章记录一下关于unicode工程的东西。回想来,这几天陆续写的MFC文章差多完结了。此系列估计不再写了。而昨天晚上发布的4.0版本,是完结版。这个工具也算是完成了。
首先是MFC中字符串常量要使用_T()。比如定义分辨率语句:
1 | m_strAddedSize = _T("160x120;176x144;320x240;352x288;640x480;704x576;720x480;1280x720;1600x1200;1920x1080"); |
比如创建注册表节点语句:
1 | RegCreateKey(HKEY_CURRENT_USER, _T("Software\\YUVPlayer-latelee.org\\Setting"), &hKey); |
char类型对应的宽字符版是wchar_t。而其它与字符串处理有关的函数,也须使用对应的宽字符版。比如sprintf对应的宽字符函数是swprintf,sscanf对应的是swscanf(safe版是在swscanf_s)。字符串比较函数strcmp对应的是wcscmp。计算字符串长度strlen对应的是wcslen。
前面文章给出的解析文件名的函数,没有考虑到宽字符,于是要将工程的宽字符转换为普通字符,再传递到该函数中。示例代码如下:
1 | // 找文件名 |
下面是从网络上找到的相对比较全面的宽字符与普通字符操作函数。
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| iswalnum() | isalnum() | 测试字符是否为数字或字母 |
| iswalpha() | isalpha() | 测试字符是否是字母 |
| iswcntrl() | iscntrl() | 测试字符是否是控制符 |
| iswdigit() | isdigit() | 测试字符是否为数字 |
| iswgraph() | isgraph() | 测试字符是否是可见字符 |
| iswlower() | islower() | 测试字符是否是小写字符 |
| iswprint() | isprint() | 测试字符是否是可打印字符 |
| iswpunct() | ispunct() | 测试字符是否是标点符号 |
| iswspace() | isspace() | 测试字符是否是空白符号 |
| iswupper() | isupper() | 测试字符是否是大写字符 |
| iswxdigit() | isxdigit() | 测试字符是否是十六进制的数字 |
大小写转换:
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| towlower() | tolower() | 把字符转换为小写 |
| towupper() | toupper() | 把字符转换为大写 |
字符比较:
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| wcscoll() | strcoll() | 比较字符串 |
日期和时间转换:
| 宽字符函数 | 描述 |
|---|---|
| strftime() | 根据指定的字符串格式和locale设置格式化日期和时间 |
| wcsftime() | 根据指定的字符串格式和locale设置格式化日期和时间, 并返回宽字符串 |
| strptime() | 根据指定格式把字符串转换为时间值, 是strftime的反过程 |
打印和扫描字符串:
| 宽字符函数 | 描述 |
|---|---|
| fprintf()/fwprintf() | 使用vararg参量的格式化输出 |
| fscanf()/fwscanf() | 格式化读入 |
| printf() | 使用vararg参量的格式化输出到标准输出 |
| scanf() | 从标准输入的格式化读入 |
| sprintf()/swprintf() | 根据vararg参量表格式化成字符串 |
| sscanf() | 以字符串作格式化读入 |
| vfprintf()/vfwprintf() | 使用stdarg参量表格式化输出到文件 |
| vprintf() | 使用stdarg参量表格式化输出到标准输出 |
| vsprintf()/vswprintf() | 格式化stdarg参量表并写到字符串 |
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| wcstod() | strtod() | 把宽字符的初始部分转换为双精度浮点数 |
| wcstol() | strtol() | 把宽字符的初始部分转换为长整数 |
| wcstoul() | strtoul() | 把宽字符的初始部分转换为无符号长整数 |
多字节字符和宽字符转换及操作:
| 宽字符函数 | 描述 |
|---|---|
| mblen() | 根据locale的设置确定字符的字节数 |
| mbstowcs() | 把多字节字符串转换为宽字符串 |
| mbtowc()/btowc() | 把多字节字符转换为宽字符 |
| wcstombs() | 把宽字符串转换为多字节字符串 |
| wctomb()/wctob() | 把宽字符转换为多字节字符 |
输入和输出:
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| fgetwc() | fgetc() | 从流中读入一个字符并转换为宽字符 |
| fgetws() | fgets() | 从流中读入一个字符串并转换为宽字符串 |
| fputwc() | fputc() | 把宽字符转换为多字节字符并且输出到标准输出 |
| fputws() | fputs() | 把宽字符串转换为多字节字符并且输出到标准输出串 |
| getwc() | getc() | 从标准输入中读取字符, 并且转换为宽字符 |
| getwchar() | getchar() | 从标准输入中读取字符, 并且转换为宽字符 |
| None | gets() | 使用fgetws() |
| putwc() | putc() | 把宽字符转换成多字节字符并且写到标准输出 |
| putwchar() | getchar() | 把宽字符转换成多字节字符并且写到标准输出 |
| None | puts() | 使用fputws() |
| ungetwc() | ungetc() | 把一个宽字符放回到输入流中 |
字符串操作:
| 宽字符函数 | 普通C函数 | 描述 |
|---|---|---|
| wcscat() | strcat() | 把一个字符串接到另一个字符串的尾部 |
| wcsncat() | strncat() | 类似于wcscat(), 而且指定粘接字符串的粘接长度. |
| wcschr() | strchr() | 查找子字符串的第一个位置 |
| wcsrchr() | strrchr() | 从尾部开始查找子字符串出现的第一个位置 |
| wcspbrk() | strpbrk() | 从一字符字符串中查找另一字符串中任何一个字符第一次出现的位置 |
| wcswcs()/wcsstr() | strchr() | 在一字符串中查找另一字符串第一次出现的位置 |
| wcscspn() | strcspn() | 返回不包含第二个字符串的的初始数目 |
| wcsspn() | strspn() | 返回包含第二个字符串的初始数目 |
| wcscpy() | strcpy() | 拷贝字符串 |
| wcsncpy() | strncpy() | 类似于wcscpy(), 同时指定拷贝的数目 |
| wcscmp() | strcmp() | 比较两个宽字符串 |
| wcsncmp() | strncmp() | 类似于wcscmp(), 还要指定比较字符字符串的数目 |
| wcslen() | strlen() | 获得宽字符串的数目 |
| wcstok() | strtok() | 根据标示符把宽字符串分解成一系列字符串 |
| wcswidth() | None | 获得宽字符串的宽度 |
| wcwidth() | None | 获得宽字符的宽度 |
C语言宽字符函数可以在头文件<wchar.h>中找到。
参考:http://www.cplusplus.com/reference/cwchar/
李迟 2015.8.19 晚

