关于printf和wprintf的有关问题,请赐教

关于printf和wprintf的问题,请赐教!
我在cygwin下测试如下代码,把这代码放到Freebsd系统下,依然有问题:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc,char* argv[]){

char *str="中国上海";
printf("%s\n",str);
char *locale=setlocale(LC_CTYPE,NULL);
printf("locale:%s\n",locale);

locale=setlocale(LC_CTYPE,"zh_CN.UTF-8");
printf("locale:%s\n",locale);

wchar_t *wcstr=L"北京您好";
wprintf(L"wide char string:%ls\n",wcstr);

return 0;
}



打印出的结果是:
中国上海
locale:C
locale:zh_CN.UTF-8
w i d e   c h a r   s t r i n g : S N}Y

请问为什么是这个情况?

即使把代码改成如下也问题依旧:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc,char* argv[]){

char *locale=setlocale(LC_CTYPE,"zh_CN.UTF-8");
printf("locale:%s\n",locale);

char *str="中国上海";
printf("%s\n",str);

wchar_t *wcstr=L"北京您好";
wprintf(L"wide char string:%ls\n",wcstr);

return 0;
}




------解决方案--------------------
额,这个跟编译器有关吧,我在VC++6.0下正常运行,但在cfree中这段代码
wchar_t *wcstr=L"北京您好";
都编译不了……换成英文就行!
------解决方案--------------------
不要混用 char 和 wchar_t 版本的流操作函数,否则会导致这些函数运行异常
试试
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc,char* argv[])
{

setlocale(LC_CTYPE,"zh_CN.UTF-8");
char *str="中国上海";
printf("%s\n",str);


wchar_t *wcstr=L"北京您好";
printf("wide char string:%ls\n",wcstr);

return 0;
}