user-0 提问: 关于printf和wprintf的问题，请赐教！

回复:
user: user-0
content: 非常感谢 mujiok2003，结贴！

user: user-1
content: 引用 5 楼 cqruan 的回复:[quote=引用 3 楼 mujiok2003 的回复:] 不要混用 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; }  非常感谢，测试的时候程序没有崩溃，呵呵，就是输出不了正确的结果。 我就是想知道原因是啥？  追问一个问题：对于wprintf，网上有人说是最终都转换成了ANSI字符集来进行输出到终端或控制台的（本论坛上找到的），但有的说是CRT时转换成了setlocale设置的locale字符集，到底那一个说的正确？谢谢！    [/quote] 后面那个更准确。msvc CRT  wint_t __cdecl _fputwc_nolock (         wchar_t ch,         FILE *str         ) {         if (!(str->_flag & _IOSTRG))         {             if (_textmode_safe(_fileno(str)) == __IOINFO_TM_UTF16LE                     || _textmode_safe(_fileno(str)) == __IOINFO_TM_UTF8)             {                 /* binary (Unicode) mode */                 if ( (str->_cnt -= sizeof(wchar_t)) >= 0 ) {                     return (wint_t) (0xffff & (*((wchar_t *)(str->_ptr))++ = (wchar_t)ch));                 } else {                     return (wint_t) _flswbuf(ch, str);                 }             }             else if ((_osfile_safe(_fileno(str)) & FTEXT))             {                 int size, i;                 char mbc[MB_LEN_MAX];                  /* text (multi-byte) mode */                 if (wctomb_s(&size, mbc, MB_LEN_MAX, ch) != 0) // 这里会根据转换为locale相关的mb                 {                         /*                          * Conversion failed; errno is set by wctomb_s;                          * we return WEOF to indicate failure.                          */                         return WEOF;                 }                 for ( i = 0; i < size; i++)                 {                         if (_putc_nolock(mbc[i], str) == EOF)                                 return WEOF;                 }                 return (wint_t)(0xffff & ch);             }         }         /* binary (Unicode) mode */         if ( (str->_cnt -= sizeof(wchar_t)) >= 0 )                 return (wint_t) (0xffff & (*((wchar_t *)(str->_ptr))++ = (wchar_t)ch));         else                 return (wint_t) _flswbuf(ch, str); }  #undef putwc  wint_t __cdecl putwc (         wchar_t ch,         FILE *str         ) {         return fputwc(ch, str); }

user: user-1
content: 引用 5 楼 cqruan 的回复:[quote=引用 3 楼 mujiok2003 的回复:] 不要混用 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; }  非常感谢，测试的时候程序没有崩溃，呵呵，就是输出不了正确的结果。 我就是想知道原因是啥？  追问一个问题：对于wprintf，网上有人说是最终都转换成了ANSI字符集来进行输出到终端或控制台的（本论坛上找到的），但有的说是CRT时转换成了setlocale设置的locale字符集，到底那一个说的正确？谢谢！    [/quote] 这两个不矛盾的。locale可以设置为ansi(比如zh_CN.gbk),或者unicode(比如zh_CN.utf8)

user: user-0
content: 引用 3 楼 mujiok2003 的回复:不要混用 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; }  非常感谢，测试的时候程序没有崩溃，呵呵，就是输出不了正确的结果。 我就是想知道原因是啥？  追问一个问题：对于wprintf，网上有人说是最终都转换成了ANSI字符集来进行输出到终端或控制台的（本论坛上找到的），但有的说是CRT时转换成了setlocale设置的locale字符集，到底那一个说的正确？谢谢！

user: user-1
content: 不要混用 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; }

user: user-0
content: 把代码文件保存为UTF-8的编码格式就可以编译了，我的这个是在liunx下测试的。

user: user-2
content: 额，这个跟编译器有关吧，我在VC++6.0下正常运行，但在cfree中这段代码wchar_t *wcstr=L"北京您好";都编译不了……换成英文就行！