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

cqruan 2014-08-23 02:26:12
我在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;
}



...全文
287 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqruan 2014-08-24
  • 打赏
  • 举报
回复
非常感谢 mujiok2003,结贴!
mujiok2003 2014-08-24
  • 打赏
  • 举报
回复
引用 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);
}

mujiok2003 2014-08-23
  • 打赏
  • 举报
回复
引用 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)
cqruan 2014-08-23
  • 打赏
  • 举报
回复
引用 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字符集,到底那一个说的正确?谢谢!
mujiok2003 2014-08-23
  • 打赏
  • 举报
回复
不要混用 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;
}

cqruan 2014-08-23
  • 打赏
  • 举报
回复
把代码文件保存为UTF-8的编码格式就可以编译了,我的这个是在liunx下测试的。
QIUSQJF 2014-08-23
  • 打赏
  • 举报
回复
额,这个跟编译器有关吧,我在VC++6.0下正常运行,但在cfree中这段代码
wchar_t *wcstr=L"北京您好";
都编译不了……换成英文就行!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧