求C++用wfstream输出Unicode文本的方法,需要核心代码。

MewX 2011-05-20 07:30:50
用wfstream输出Unicode文本的方法,
需要贴出核心代码。

最好再告诉我wstring类型的字符串用wfstream输出Unicode文本的方法。

但是最近遇到一个问题,
setlocal之后,wcout可以输出A,但是以二进制打开某文件后,也输出了0xFFFE之后,
用xxx.write( A, sizeof(A) );却只输出英文字母,且没有补0x00,而且汉字也没有输出。
请问怎么解决?

代码如下:



int _tmain( int argc, _TCHAR *argv[ ] )
{
setlocale( LC_ALL, "chinese" );
wfstream test;
test.open( "test.txt", ios_base::binary | ios_base::out | ios_base::trunc );
const wchar_t Header[ 2 ] = { 0xFF, 0xFE };
test.write( &Header[ 0 ], 1 );
test.write( &Header[ 1 ], 1 );
const wchar_t A[100] = L"asp晕";
cout << "Length= " << wcslen( A ) << endl;
wcout << A << endl;
test.write( A, sizeof( A ) );
test.close( );
system( "PAUSE" );
return 0;
}
...全文
1179 24 打赏 收藏 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
MewX 2011-05-26
  • 打赏
  • 举报
回复
结贴了:
下面公布完美支持Unicode的代码,这里可以读取Unicode,并输出,只是不能数到屏幕上而已。

ofstream ofs( "test.txt", ios::binary | ios::out );
ifstream ifs( "Test_Read.txt", ios::binary | ios::in );
wchar_t temp[ 2 ];
ifs.read( (char *)temp, 2 );
memset( temp, L'\0', sizeof(temp) );
ofs.write( "\xFF\xFE", 2 );
int k = 0;
while ( 1 ) {
k ++;
ifs.read( (char *)temp, 2 );
if ( ifs.eof( ) ) break;//经验表明,放在这里最恰当!~
ofs.write( (char *)temp, 2 );
}
ifs.close( );
ofs.close( );
MewX 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lhcwjy 的回复:]

wfstream输出时进行Unicode到本地编码的转换,因此很难直接输出Unicode编码,一种方法是替换wfstream内置的转码器,不过这样做比较麻烦,实际上直接用fstream就行:
ofstream ofs("c:\\abc.txt",ios::binary|ios::out);
ofs.write("\xff\xfe",2);
ofs.write((char *)L"中国",4……
[/Quote]

真是神了,
高手果然非同反响
能否再透露一下怎么读Unicode,拜托
www_adintr_com 2011-05-25
  • 打赏
  • 举报
回复
用 C 读写 Unicode 文件:

FILE* pFile = NULL;

if(_wfopen_s(&pFile, filename, L"r,ccs=UNICODE") != 0)
return;

...

fclose(pFile);

写只需要把 r 换成 w
www_adintr_com 2011-05-25
  • 打赏
  • 举报
回复
直接用 C API 吧, C++ 对 UNICODE 的支持不完善是明确的, 去折腾太浪费时间了.
白云飘飘飘 2011-05-25
  • 打赏
  • 举报
回复
wchar_t wc;

ifstream ifs("c:\\abc.txt",ios::binary|ios::in);

ifs.read((char *)&wc,2);

if (ifs.gcount()!=2||wc!=L'\xfeff')
{
ifs.close();
exit;
}
while(ifs.read((char *)&wc,2),ifs.gcount()==2);
ifs.close();
白云飘飘飘 2011-05-24
  • 打赏
  • 举报
回复
wfstream输出时进行Unicode到本地编码的转换,因此很难直接输出Unicode编码,一种方法是替换wfstream内置的转码器,不过这样做比较麻烦,实际上直接用fstream就行:
ofstream ofs("c:\\abc.txt",ios::binary|ios::out);
ofs.write("\xff\xfe",2);
ofs.write((char *)L"中国",4);
ofs.close();
kevin626521 2011-05-24
  • 打赏
  • 举报
回复
可以用wcout或者wprintf
MewX 2011-05-24
  • 打赏
  • 举报
回复
经过测试,没有效果,
希望得到更好的答案
Jarrys 2011-05-22
  • 打赏
  • 举报
回复
对于Unicode文件,可以先在文件开始写入0xFFFE,这是Unicode与ASCII区别,然后再按照ASCII的方式写就OK
MewX 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangsongcui 的回复:]

http://hi.baidu.com/zhangsongcui/blog/item/b24c7b80baec6c2a66096efe.html
[/Quote]
我试试去,下午再上,
期待更多的答案,
好答案会加分的哦!!!!!
zhangsongcui 2011-05-22
  • 打赏
  • 举报
回复
http://hi.baidu.com/zhangsongcui/blog/item/b24c7b80baec6c2a66096efe.html
MewX 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq120848369 的回复:]

C/C++ code
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
wfstream wfstrm(stdout);

wfstrm.imbue(locale("chs"));

wfstrm<<L"abc哎"<<endl;

wfstrm.close();
……
[/Quote]

这个输出来的是ANSI编码的。
MewX 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 downmooner 的回复:]

去掉 打开标志ios_base::binary 呢。
[/Quote]
去掉binary打开标志后,根本不输出了。
MewX 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bibingyan 的回复:]

对于Unicode文件,可以先在文件开始写入0xFFFE,这是Unicode与ASCII区别,然后再按照ASCII的方式写就OK
[/Quote]
我试试去,睡过觉再给你答复
qq120848369 2011-05-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
wfstream wfstrm(stdout);

wfstrm.imbue(locale("chs"));

wfstrm<<L"abc哎"<<endl;

wfstrm.close();

return 0;
}


这样不行么。
downmooner 2011-05-21
  • 打赏
  • 举报
回复
去掉 打开标志ios_base::binary 呢。
MewX 2011-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]

我记得答案是,C++标准规定,wfstream必须不输出unicode码。
[/Quote]
我先闪了,明天下午在上,希望能贴出您测试通过的代码
我将感激不尽。
MewX 2011-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]

我记得答案是,C++标准规定,wfstream必须不输出unicode码。
[/Quote]

必须不输出???~!!!
这么雷!!!

那怎么用C++标准库Unicode?
我只有这个水平。。。。
求教!!
taodm 2011-05-21
  • 打赏
  • 举报
回复
我记得答案是,C++标准规定,wfstream必须不输出unicode码。
MewX 2011-05-21
  • 打赏
  • 举报
回复
在Google上找了,试过几个都是假的,
直接来这里伸手了,
100%按时结账
加载更多回复(4)
内容概要:本文围绕“数据驱动下光伏建筑群源荷不确定性解析及其储能多目标低碳经济调度研究”展开,提出了一种融合数据驱动方法与多目标优化算法的综合调度框架。研究首先基于历史数据对光伏发电出力与建筑负荷的不确定性进行建模,采用概率预测与场景生成技术刻画源荷波动特性,并通过典型场景提取降低输入复杂性。在此基础上,构建了以最小化系统运行成本、降低碳排放强度、提升可再生能源消纳率为目标的多目标优化模型,引入NSGA-II等先进智能优化算法求解Pareto最优前沿,实现经济性与低碳性的协同优化。通过Python编程完成模型搭建与仿真验证,结果表明该方法能有效应对源荷双重不确定性,在保障供电可靠性的前提下,实现了储能系统的优化配置与多目标调度决策的均衡协调; 适合人群:具备一定电力系统基础知识和Python编程能力,从事能源系统优化、智能调度、低碳技术等相关领域的研究生、科研人员及工程技术人员; 使用场景及目标:①应用于光伏建筑群、工业园区微电网等分布式能源系统的运行调度;②支撑含储能系统的多目标低碳经济调度决策,兼顾能源成本节约与碳排放控制双重目标;③为相关课题的研究与工程实践提供完整的算法实现参考与可复现的仿真案例支持; 阅读建议:建议读者结合文中提供的Python代码深入理解模型构建与求解流程,重点关注不确定性建模与多目标优化的耦合机制,可在实际数据基础上复现并改进算法,进一步探索不同权重策略下的调度方案优选方法。
代码下载链接: https://pan.quark.cn/s/cd4149768c91 互联网灰度部署系统解决方案的核心内容深度阐释: 一、灰度发布概念 灰度发布(亦称金丝雀发布)是在云计算及互联网服务领域中常见的一种发布策略,其中心理念是在全面推广新版本前,先向部分用户群体开放试用,以此来降低更新过程中的潜在风险。这种发布模式能够有效地兼顾用户体验与系统稳定性,它允许企业逐步将新的代码或功能部署至生产环境,并且仅对部分用户群体可见。此种做法有助于提前识别潜在问题,对用户体验造成的影响较小,并且能够获取更为真实的用户反馈信息。 二、系统现状和建设背景 在传统的发布模式中,每次更新都需要暂停服务才能发布新版本,这在用户体验和服务连续性方面存在明显不足。伴随互联网经济的繁荣发展,移动终端与日常生活的融合日益紧密,对互联网系统的支撑需求持续增长。特别是在电信行业,系统需要实现7*24小时不间断服务,以适应快速变化的市场需求和频繁更新的技术。因此,迫切需要一种新的发布方式,即灰度发布,用以提升产品发布的效率并改善用户体验。 三、灰度发布的优势与挑战 灰度发布相较于传统全量发布的优势包括: 1. 提供了新功能的试错空间,支持边发布边进行优化。 2. 维持服务的连续性,实现无缝升级。 3. 针对不同用户群体实施功能区分,提升用户体验和满意度。 4. 收集用户反馈,为后续版本的功能迭代和优化提供指导。 然而,灰度发布同样面临挑战,例如技术实现的复杂性、增加的运维压力等。 四、灰度发布的具体实施策略 1. 建设目标:保证湖北联通对外服务的互联网程序能够实现7*24小时不中断的灰度发布,实现无缝升级,同时全面提升用户体验。 2. 总体说明:需要通过灰度发布实现迭代开发和版本快速更...

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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