火焰傀偶的挣扎旅程

纯爷们的一生就是不停地燃烧,keep on burning soul!!
随笔 - 6, 文章 - 5, 评论 - 4, 引用 - 0
数据加载中……

c++中关于unicode文本文件的读写

只要试过用c++对含有中文的txt进行读写的人,他八成会碰上乱码的问题。

这是因为中文是宽字符表示的,需要用2个窄字符,也既是16位二进制来保存,如果还是用回鬼佬那一套单字节的办法,那么就会全部乱套,自然是显示出一堆不明就里的乱码了~~

在 这里,来谈谈unicode文本文件的读写方法,对于中文文本,网上流传的许多方法都是通过设置setlocale(LC_ALL, "chs")来解决,我一开始也这么干的,但后来因为项目需求发现这样根本无法解决其他宽字符语言的问题,而且这么做还会影响其他文件的读写,因此这只能算是一个偏门的方法。

我也曾经尝试过用wfstream,wostream来读写文件,可结果行不通,后来想想,还是用最原始的方式,fstream和ostream来做这些事算了。unicode归根到底只是宽字符,要读,只要每次连读两个字节就好。写也是一样的道理。

关键点是:
1.用ofstream打开文件时要加上ios::binary参数,让他以二进制方式读取文件。
2.写文件时要先写入"\xFF\xFE"(即0xFEFF)头,以标识这是一个unicode文件。
3.注意换行符是2个宽字符表示的,在windows下是"/r/n"表示换行。

下面是一个读写unicode文本的小程序:

 1 #include<iostream>
 2 #include<fstream>
 3 #include<istream>
 4 #include<string>
 5 using namespace std;
 6 
 7 void saveWideFile( ostream& out, wchar_t const* str,int size )
 8 {
 9       char const* pos = (char   const*)str;
10       if(str[0!= 0xFEFF)/写入unicode文件头
11       {
12             char const* const utf16head = "\xFF\xFE ";
13             out.write( utf16head, 2 );
14       }
15 
16       out.write( pos, size );
17 }
18 
19 
20 int main()
21 {
22      //预先保存一个a.txt,其内容为:
23      /*
24           abcdefg
25           何何何글금기
26      */
27  
28       wchar_t wc[50= {0};//读取的内容用宽字符保存(其实也可以使用short,更有利于跨平台)
29     
30       fstream wfile("a.txt", ios::binary|ios::in);
31       wfile.read((char*)wc, sizeof(wc));
32 
33       ofstream out("b.txt ", ios::binary |ios::out);//把a.txt的内容读取,并保存为b.txt
34       saveWideFile(out, wc, sizeof(wc));
35       out.close();
36 
37       return 0;
38 }
39 

posted on 2012-03-29 21:24 WhiteDummy 阅读(5314) 评论(0)  编辑 收藏 引用 所属分类: c/c++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理