只要试过用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