wchar_t介绍及相关函数

1.函数引入
先引入一个宽字符串长度的函数,原型如下:
       size_t __cdel wchlen(const wchar_t*); 
为什么要专门定义这些函数呢?最根本的原因是,ANSI下的字符串都是以’\0’来标识字符串尾的(Unicod以“\0\0”束),许多字符串函数的正确操作均是以此为基础进行。而我们知道,在宽字符的情况下,一个字符在内存中要占据一个字的空间,这就会使操作ANSI字符的字符串函数无法正确操作。以”Hello”字符串为例,在宽字符下,它的五个字符是: 
0x0048 0x0065 0x006c 0x006c 0x006f 
在内存中,实际的排列是: 
48 00 65 00 6c 00 6c 00 6f 00 
于是,ANSI字符串函数,如strlen,在碰到第一个48后的00时,就会认为字符串到尾了,用strlen对宽字符串求长度的结果就永远会是1! 

2.宽字符处理函数函数与普通函数对照表 
宽字符函数 普通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() 从标准输入中读取字符, 并且转换为宽字符 
putwc() putc() 把宽字符转换成多字节字符并且写到标准输出 
putwchar() putchar() 把宽字符转换成多字节字符并且写到标准输出 
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 获得宽字符的宽度 

另外还有对应于memory操作的 wmemcpy(), wmemchr(), wmemcmp(), wmemmove(), wmemset().
参考资料: http://hi.baidu.com/feifirkissyan/item/c25c0f4defd55d0a6dc2f072 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开源项目TinyXml项目所涉及的字符编码说明如下: 1. TinyXml函数调用接口的字符型参数,仅支持`窄字符`格式(char*),不兼容`宽字符`格式(wchar_t*)。 2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码和UTF8编码的Xml字符串,也即`多字节编码`。 3. TinyXml函数提供的Xml内容解析功能,不支持内容以UTF16编码和UTF32编码的Xml字符串,也即`Unicode编码`。 4. UTF8编码是Unicode编码的一种实现方式,以不定个数的字节来存储一个Unicode码值,支持多国语言文字。 也即,UTF8编码在编码实现上属于`多字节编码`,在编码标准上属于`Unicode编码`。 5. 人类语言中同一个的字符,如果在各种不同的标准如ANSI编码、UTF8编码、UTF16编码和UTF32编码中都存在码值, 就可以相互转换。因为各个标准下的可编码字符容量不同,部分语言字符会在一个编码标准库下存在, 而在另外一个编码标准库下不存在,这时精确的相互转换就无法执行,但是仍然有默认字符转换。 -- 6. VC语言,当定义了宏 _UNICODE 后,_T系列宏或函数,以`宽字符`承载UTF16编码。 TinyXml如何提供`宽字符`函数接口,支持解析UTF16编码、UTF32编码标准下的Xml字符串呢? 本项目: - 新增适用于`宽字符`参数的函数接口,调用字符集转换功能,转换为`窄字符`参数,再回调TinyXml原版接口。 - 对于以UTF16编码、或UTF32编码的Xml字符串,转换为UTF8编 --

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值