多字节字符与宽字符的printf输出
有某些情况需要用到输出多字节字符,而直接使用
[php]
printf("%s", xxx);
[/php]
的方式只能输出第一个字符,例如下面的内存块中保存的宽字符:
[php]
0x00294B38 43 00 3a 00 5c 00 57 00 69 00 6e 00 64 00 6f 00 77 00 73 00 5c 00 73 00 79 C.:.\.W.i.n.d.o.w.s.\.s.y
0x00294B51 00 73 00 74 00 65 00 6d 00 33 00 32 00 5c 00 74 00 61 00 73 00 6b 00 68 00 .s.t.e.m.3.2.\.t.a.s.k.h.
0x00294B6A 6f 00 73 00 74 00 2e 00 65 00 78 00 65 00 00 00 cd cd cd cd cd cd cd cd cd o.s.t…e.x.e…?????????
[/php]
如果直接使用
[php]
printf("%s", xxx);
[/php]
输出,则会将0x43后面的0x00当作结束符,也就是只会认为只有C字符就结束了,输出的时候会发现,只输出了C后面的内容则没有输出,而且使用
[php]
strlen(xxx);
[/php]
来计算长度也为1。
如果需要完成输出,则需要将printf中的小写s改为大写即可,即
[php]
printf("%S", xxx);
[/php]