在C语言中使用wchar_t等宽字符显示中文测试
#include <stdio.h>
int main(int argc, char *argv[])
{
fprintf(stdout, "中文测试\n");
}
在VC6.0中和gcc上编译能通过测试,(VC6.0使用GBK编码,gcc用到了utf8编码)
今天,重新翻开了C语言中书,说到有C99标准支持了“扩展字符集”(UCN机制),其中有说到wchar_t类型支持宽字节的处理(utf8)。
我想,对于中文的处理应不在话下,于是开使测试:
#include <stdio.h>
#include <wchar.h>
int main(int argc, char *argv[])
{
wchar_t out[4] = L'中文数组';
fprintf(stdout, "%ls\n", out);
}
高高兴兴编译后,测试,得到结果却是什么都没有,我想问题出在哪呢?首先查看fprintf的返回值看看
int result = fprintf(stdout, "%ls\n", out);
fprintf(stdout, "result: %d", result);
//得到的值是负1
再次查看yelp文档,发现其测试用例只是用到了一些ASCII码字符:
wchar_t *out = L"@@@@";
看来,要通过yelp查找中文的输出帮肋是没有办法的了,到网上找找答案,终于找到了一个解决方案:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc, char *argv[])
{
if(setlocale(LC_CTYPE, "") != NULL)
{ /*设置为本地环境变量定义的locale*/
fprintf(stderr, "can't set the locale\n");
}
wchar_t out[4] = L'中文数组';
fprintf(stdout, "%ls\n", out);
}
得到正确的结果。
先前有看到locale的设置,但是就是没和这个wchar_t关系到,看来,我得要重新翻翻书了
在 程序开始时加上:
if(setlocale(LC_CTYPE, "") == NULL) /*设置为本地环境变量定义的locale*/
return 0;
注意了...string 或者 wstring 需要 调用 c_str()转换....
就能正确显示中文了...