`

一个写Unicode 文本文件的方法

阅读更多

//原来一直用C中wfopen,putwc这些东西写unicode的文件

//一直没发现用wstring,wchar_t 的方法。

//最近在下面这个位置,发现一个好东西。
//http://www.codeproject.com/vcpp/stl/upgradingstlappstounicode.asp?df=100&forumid=16224&exp=0&select=788194
#include <locale>
#include <stdlib.h>
#include <TCHAR.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

using std::codecvt ;
typedef codecvt < wchar_t , char , mbstate_t > NullCodecvtBase ;

class NullCodecvt
: public NullCodecvtBase
{
public:
typedef wchar_t _E ;
typedef char _To ;
typedef mbstate_t _St ;

explicit NullCodecvt( size_t _R=0 ) : NullCodecvtBase(_R) { }

protected:
virtual result do_in( _St& _State , const _To* _F1 , const _To* _L1 , const _To*& _Mid1 ,
_E* F2 , _E* _L2 , _E*& _Mid2 ) const
{
return noconv ;
}
virtual result do_out( _St& _State ,
const _E* _F1 , const _E* _L1 , const _E*& _Mid1 ,
_To* F2, _E* _L2 , _To*& _Mid2 ) const
{
return noconv ;
}
virtual result do_unshift( _St& _State ,
_To* _F2 , _To* _L2 , _To*& _Mid2 ) const
{
return noconv ;
}
virtual size_t do_length( _St& _State , const _To* _F1 ,
const _To* _L1 , size_t _N2 ) const _THROW0()
{
return (_N2 < (size_t)(_L1 - _F1)) ? _N2 : _L1 - _F1 ;
}
virtual bool do_always_noconv() const _THROW0()
{
return true ;
}
virtual int do_max_length() const _THROW0()
{
return 2 ;
}
virtual int do_encoding() const _THROW0()
{
return 2 ;
}
} ;

#define IMBUE_NULL_CODECVT( outputFile ) \
{ \
NullCodecvt* pNullCodecvt = new NullCodecvt ; \
locale loc = locale::classic() ; \
loc._Addfac( pNullCodecvt , NullCodecvt::id, NullCodecvt::_Getcat() ) ; \
(outputFile).imbue( loc ) ; \
}

///自己随便以下写个测试,提醒一下自己别忘了

int main()
{

string str1="abc中文Chinese与英文English混排ss,,mbstowcs转换";
string str="efg中文Chinese与英文English混排ss\",,MultiByteToWideChar转换";
wstring str2=L"真是折腾人阿!!!";
wchar_t wst[100]={};
char czz[101]="Begin被替换End";
WCHAR tx1[100]={}; // TCHAR

cout<<str<<endl;
cout<<czz<<endl;
locale loc(""),oldloc;

setlocale(LC_ALL,""); //设置本地默认
// setlocale(LC_ALL,"CHS"); //直接指定本地

mbstowcs(wst, str1.c_str(), str1.size()+1);
setlocale(LC_ALL,"C"); //恢复默认
cout<<czz<<endl; //不恢复的话,这里输出貌似就出问题了。

setlocale(LC_ALL,""); //设置本地默认
lstrcpy(wst,str2.c_str());
wcstombs(czz,str2.c_str(),sizeof(czz));
setlocale(LC_ALL,"C"); //用完恢复

strcpy(czz,"Begin被替换End");

MultiByteToWideChar( CP_ACP,0, str.c_str(),strlen(str.c_str())+1, tx1,sizeof(tx1)/sizeof(tx1[0]));
WideCharToMultiByte(CP_ACP,0,tx1,lstrlen(tx1)+1,czz,sizeof(czz)/sizeof(czz[0]),NULL,NULL);
oldloc=wcout.imbue(loc); //设置,,如果不进行设置,输出将不正确
wcout<<endl;
wcout<<tx1<<endl;
wcout<<wst<<endl;
cout<<czz<<endl;
wcout<<str2<<endl;
wcout<<"the end"<<endl;

wcout.imbue(oldloc); //恢复

//建一个Unicode的文本文件存储之。
wofstream UniFile;
UniFile.open("C:\\uinFile.txt",ios::out|ios::binary); //
UniFile<<UniFile.narrow(0xFF); //设置Unicode文本文件标志.这两个是窄字符
UniFile<<UniFile.narrow(0xFE);

IMBUE_NULL_CODECVT( UniFile ) ;
//为什么要用这个,原来写入文件时字符被默认的本地化对象转换为nawwow了。所以总是不成功。
//现在通过这一步,让流使用自定义的本地对象进行对应的转换。
UniFile<<wst<<UniFile.widen('\r')<<UniFile.widen('\n'); //使用回车换行都要宽字符化。
UniFile<<tx1<<UniFile.widen('\r')<<UniFile.widen('\n');
UniFile<<str2<<UniFile.widen('\r')<<UniFile.widen('\n');
//UniFile.imbue(loc);
UniFile.close();

system("pause");
return 0;
}

分享到:
评论

相关推荐

    vfp9 显示和输出 unicode 文本试验

    `test.dbf` 是一个数据库表文件,很可能包含需要处理的Unicode文本数据。在VFP中,通常使用DBF文件存储结构化数据。要处理Unicode,可能需要对原有的文本字段类型进行调整,以支持宽字符(如:LGLFIELD类型),这样...

    Delphi读写UTF-8、Unicode格式文本文件 .mht

    Delphi读写UTF-8、Unicode格式文本文件 .mht

    易语言置Unicode文本到剪辑版

    1. **读取Unicode文本**:易语言提供了读取文件或字符串为Unicode格式的函数,例如可以使用“读文件”命令配合“文本编码”参数设置为“Unicode”来读取一个包含Unicode字符的文本文件。 2. **处理Unicode文本**:...

    vb读写Unicode文件的完美实例

    UTF-16是本实例中讨论的重点,它以两个字节表示一个字符,对于英文字符,这与ASCII编码相同,但对于其他语言,如中文、日文等,每个字符将占用两个字节。 读取Unicode文件时,我们首先需要以二进制模式打开文件,...

    如何将一个ansi的文本文件转为unicode格式

    这段代码首先使用`StringList`加载一个ANSI编码的文本文件,然后将文本转换为Unicode字符串,并最终将其写入一个新的文件。然而,示例指出,在处理包含中文字符的文本时,简单的字符串类型转换可能不足以得到正确的...

    DEELX_Unicode文本测试.zip

    3. **文件I/O操作**: Unicode文本文件的读写操作可能会有所不同,因为需要考虑编码转换。DEELX可能提供了专门的API或函数来处理Unicode编码的文件,避免在读写过程中出现乱码问题。 4. **界面设计**: 对于支持...

    文本与unicode转换工具

    `文本与unicode码转换小工具V1.02.02`则是实际的转换工具软件,可能是一个独立的可执行文件,用户可以直接运行使用。 在实际应用中,Unicode转换工具可以帮助解决各种编码问题,比如网页显示乱码、数据库存储异常、...

    Go-Unicode文本的ASCII转换形式

    `go-unidecode`是一个Go语言的库,专门用于将Unicode文本转换为ASCII近似表示。它适用于处理包含非ASCII字符(如特殊符号、非拉丁字母)的字符串,将其转换为可读的ASCII格式,便于在ASCII环境中使用和展示。例如,...

    批量转换Ansi文本至Unicode文本工具

    1. **批量转换**: 这个工具能够一次性处理一个文件夹内的所有txt文本文件,包括其子文件夹中的文件。批量处理大大提高了效率,避免了用户手动逐个转换大量文件的繁琐工作。 2. **删除多余空行**: 在转换过程中,该...

    VB6读写Unicode_vb6_unicode_

    要进行Unicode读写,你需要创建或打开一个Unicode文本文件。VB6中没有内置的Unicode文件操作函数,但可以通过以下方法实现: 1. **打开Unicode文件**:你可以使用`OpenTextFile`函数的第三个参数`ForInput As #1`或...

    文本转换为unicode格式

    本项目提供了一个用Delphi编写的程序,用于将文本文件转换为Unicode格式,这样可以确保文件在各种操作系统和编程环境中都能正确显示和处理。 Delphi是一种基于Object Pascal的集成开发环境(IDE),它提供了强大的...

    生成Unicode编码的文本文件示例

    在VB(Visual Basic)中,生成Unicode编码的文本文件是一个常见的需求,尤其是在处理多语言的应用程序时。 以下是一个简单的VB源代码示例,用于创建Unicode编码的文本文件: ```vb Sub SaveUnicodeFile() Dim ...

    易语言API置剪辑版Unicode文本

    @无阻。

    VS2008在Unicode环境下将Unicode文本转为ANSI文本

    1. **理解文件编码**:首先,你需要确定输入的Unicode文本文件的编码格式,通常为UTF-16(Little Endian)。你可以使用文本编辑器(如Notepad++)查看文件的编码类型。 2. **读取Unicode文本**:使用C++标准库中的`...

    vfp9 显示和输出 unicode 文本(bug fixed) demo

    8. `unicode.VCT`:可能是一个自定义的VFP类库,包含了处理Unicode文本的自定义类或方法。 9. `unicode.vcx`:VFP的类库文件,存储了自定义类的定义,可能是专门为处理Unicode文本而创建的。 综上所述,这个压缩包...

    易语言读Unicode模块

    在实际应用中,例如开发一个多语言的软件,或者需要从网络上读取不同编码格式的数据,这些模块都将发挥重要作用。 总的来说,"易语言读Unicode模块"是对易语言标准库的有力补充,它扩展了易语言处理文本的能力,让...

    批量Ansi文本与Unicode文本转换工具

    HTML-&gt;TXT转换、文件合并、TXT文件段落合并、TXT文件分行、编码(GB/GBK/Big5/Shift-JIS/Unicode)转换(只能用于Win 2k/XP)、文本替换、HTML代码整理、文件切分、文本提取、正则表达式、TCR批量压缩/解压.

    VC ANSI环境下按行读取ANSI、UNICODE 、UNICODE big endian、UTF-8四种文本文件

    VC ANSI环境下按行读取ANSI、UNICODE、UNICODE big ...本资源摘要信息为开发者提供了一个完整的解决方案,用于在VC ANSI环境下按行读取四种不同编码格式的文本文件,包括ANSI、UNICODE、UNICODE big endian和UTF-8。

    unicode文件的压缩包

    Unicode是由Unicode联盟制定的一种编码体系,它为每个可打印或可视的字符分配一个唯一的数字,称为码点。这个数字范围从0到1,114,111,涵盖了世界上几乎所有的文字系统,包括拉丁文、希腊文、汉字、阿拉伯文、希伯来...

    易语言UNICODE解决方法源码

    在处理Unicode字符集时,易语言可能会遇到一些挑战,因为Unicode是一个广泛使用的字符编码标准,支持全球多种语言的字符。"易语言UNICODE解决方法源码"这个主题意味着我们将探讨如何在易语言中有效地处理Unicode数据...

Global site tag (gtag.js) - Google Analytics