当前位置:首页 > 工业控制 > 电子设计自动化
[导读]使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中

使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中文,一会儿不支持中文文件名的,搞得头大。网上搜了搜,没有发现适用于所有情况的解决方案。不过后来自己经过多次测试,基本解决了这些问题,现在写成文字作为一个总结,也供碰到同样问题的朋友参考。关于C语言中的 printf和wprintf的中文输出,本文也进行了探讨。

需要说明的是,我的开发环境是VS 2005(标准库当然也是微软实现的),不保证其它环境下是相同的效果。

1、cout和wcout

在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:

wcout.imbue(locale(locale(),"",LC_CTYPE)); // ①

也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”。

wcout.imbue(locale(""));

2、ofstream和wofstream

在缺省的C locale下,ofstream能正确输出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中输出中文。要解决这个问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstream和wofstream的问题都解决了,但 cout和wcout却不能输出中文了。要让cout和wcout输出中文,需要将全局locale恢复原来的设置,如下所示:

locale &loc=locale::global(locale(locale(),"",LC_CTYPE)); // ②

ofstream ofs("ofs测试.txt");

wofstream wofs(L"wofs测试.txt");

locale::global(loc); // ③

ofs<<"test测试"<<1234<<endl;

wofs<<L"Another test还是测试"<<1234<<endl;

3、printf和wprintf

加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):

printf("%s", "multibyte中文n"); // ④

printf("%S", L"unicode中文n"); // ⑤

wprintf(L"%S", "multibyte中文n"); // ⑥

wprintf(L"%s", L"unicode中文n"); // ⑦

缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:

setlocale(LC_CTYPE, ""); // ⑧

但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:

setlocale(LC_CTYPE, "C"); // ⑨

但恢复后,printf和wprintf输出Unicode文本又不正常了(输出MultiByte文本总是正常的)。总不能每写一个 printf/wprintf就设置一次然后再恢复一次吧?所以,建议不要混用iostream和printf/wprintf,实在要混用,那就让 printf/wprintf只输出MultiByte字符串,这样不需要调用setlocale(),也就不会影响到cout和wcout.

总结

总之,用iostream、printf/wprintf输出中文,有点麻烦。概括起来要点如下:

·如果要用wcout,需要在使用之前按语句①将其locale设置为本地语言;

·如果要用ofstream或wofstream,要在打开文件之前按语句②将全局locale设为本地语言并保存初始的全局locale.然后在打开文件之后,按语句③将全局locale恢复为初始值;

·不要混用iostream和printf/wprintf.如果要混用,只用printf/wprintf输出MultiByte字符串;

·单独使用printf/wprintf时,如果要输出Unicode字符串,需要按语句⑧设置C语言的全局locale.如果只输出MultiByte字符串,则不需设置。



来源:香香公主0次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着无人机的普及,越来越多的人开始使用无人机进行各种飞行任务,但是不当的使用会给公共安全和社会秩序带来潜在的风险,因此对于无人机使用的规定也变得越来越严格。本文将介绍无人机使用的标准和规定,以帮助大家正确使用无人机。

关键字: 无人机 标准 UAV

智能家居作为新兴领域,逐渐走入了人们的生活。智能家居系统是利用先进的计算机技术、网络通讯技术、智能云端控制、综合布线技术、医疗电子技术依照人体工程学原理,融合个性需求,将与家居生活有关的各个子系统如安防、灯光控制、窗帘控...

关键字: 智能家居 标准

因为5G涵盖内容更丰富,上述三个5G专利池侧重点也不同:Avanci侧重汽车和物联网;Sisvel侧重手机等终端领域;Alium侧重无线接入网RAN。

关键字: 5G 标准 必要专利

为了保证航天型号元器件的固有质量和使用质量满足航天工程的要求,需要制定一系列标准和文件,规范元器件的选择、采购和应用。这一系列标准和文件按照其内在联系形成的科学有机整体就是元器件标准体系。

关键字: 电子 标准

ISO26262是汽车的一个安全性国际标准。目前我国也在积极参与中。是行业标准的一种。

关键字: iso26262 标准

摘 要:我们国家从今年开始,正式成立了国家智慧城市标准化协调推进主体,这标志着我们国家智慧城市标准工作正式开始启动。具体工作由国家智慧城市标准化工作组来负责,一个是国际化标准工作组,另外一个是基础工作组,这两个已经启动。...

关键字: 关键词 物联网 智慧城市 标准 评价体系

在EPIC、Steam经常充当大善人,免费送游戏之后,育碧今天也要喜加一了,经典游戏大作《孤岛惊魂3》免费领取,难得的是这次优惠活动仅限Uplay中文玩家。 这次喜加一是育碧中国迎接即将到来的第二场育

关键字: 育碧 喜加一 孤岛惊魂3 uplay 中文

  当今的音频设计挑战在于如何模拟实际的声音并通过各种音频设备进行传送。声音可以来自任何方向,实际上,我们的大脑能够计算并感知声音的来源。例如,当战斗机从一点飞到另一点时,它所产生的声音实际上来自无数

关键字: 音频 协议 标准

  作为第四次照明革命,LED灯逐渐走进人们的视野。然而,整个LED照明市场才刚刚起步,大量小作坊制作的劣质产品充斥整个不成熟的市场,市场产品良莠不齐,让整个LED照明产业的发展陷入困境。有业内

关键字: led照明 标准

  物联网技术伴随着科技的迅速发展已经不再是一个新鲜名词,但是它却正在悄然无声的改变着我们的生活。智能家居的推广,智慧城市的建设无一不体现着它的应用。   如果说4年前,时任总理温家宝在

关键字: 手机通信 标准 物联网
关闭
关闭