example 1:
#include <locale> #include <fstream> using namespace std; class UniFacet : public codecvt<wchar_t, char, mbstate_t> { protected: virtual result do_in(mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t&, wchar_t, wchar_t* , wchar_t&) const {return noconv;} virtual result do_out(mbstate_t&, const wchar_t*, const wchar_t*, const wchar_t*, wchar_t*, wchar_t*, wchar_t&) const {return noconv;} virtual result do_unshift(mbstate_t&, wchar_t*, wchar_t* , wchar_t*) const {return noconv;} virtual int do_length( mbstate_t& , const wchar_t*, const wchar_t*, size_t) const _THROW0() {return 1;} virtual bool do_always_noconv() const _THROW0() {return true;} virtual int do_max_length() const _THROW0() {return 1;} virtual int do_encoding() const _THROW0() {return 1;} }; int main() { //建一个Unicode的文本文件。 wchar_t wch[100]=L"a中文Chinese与英文English混排ss/",,可用MultiByteToWideChar转换,也可用mbstowcs转换"; wstring wstr=L"真是折腾人阿!!!"; wofstream UniFile; UniFile.open("D://UniFile.txt",ios::out|ios::binary); // locale locUni(locale::classic(),new UniFacet); //这句解释一下,local::classic() 是loccale的一个静态成员函数,他返回一个当前使用的 //locale对象的一个引用,我们现在通过locale的一个构造函数,重新构造一个新的locale对象 //locUni,并把其中codecvt这个facet换成我们自己定义的UniFacet. UniFile<<UniFile.narrow(0xFF); //设置文件标志;这两是窄字符,一般Unicode文本文件 UniFile<<UniFile.narrow(0xFE); //都以这两个字符作为其起始标志位。 UniFile.imbue(locUni); //改变locale; UniFile<<wch<<UniFile.widen('/r')<<UniFile.widen('/n'); //回车换行都要宽字符化 UniFile<<wstr<<UniFile.widen('/r')<<UniFile.widen('/n'); UniFile<<"123456"<<UniFile.widen('/r')<<UniFile.widen('/n'); UniFile<<L"ABCDE"<<UniFile.widen('/r')<<UniFile.widen('/n'); UniFile<<34545678<<UniFile.widen('/r')<<UniFile.widen('/n'); UniFile<<L"这样就可以了"<<UniFile.widen('/r')<<UniFile.widen('/n'); UniFile.close(); system("pause"); return 0; }example 2:#include <string> #include <fstream> using namespace std; int main() { wstring wstr(L"中文Chinese"); char BOM[] = {'/xFF', '/xFE'};//文件头,用于标示文本文件的格式 ofstream out("test.txt"); out.write(BOM, sizeof(BOM));//将文件头写入文件 out.write((const char*)wstr.c_str(), wstr.size() * sizeof(wchar_t)); out.close(); return 0; }example 3: //vs2010不成功#include <locale.h> #include <stdio.h> #include <stdlib.h> int main() { FILE *fp=fopen( "test.txt ", "w "); setlocale(LC_ALL, "chs "); int i = 0xced2; wchar_t w = i; for(i=0; i <2; i++)fprintf(fp, "%c ", *(char *)&w); fclose(fp); //文件内容为 汉字:乙 system( "PAUSE "); return 0; }