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; }