输出文字到utf8编码的文件

本文详细介绍了如何在进行文件写入操作时,将宽字符转换为UTF-8编码,以确保生成的文件正确显示。通过使用特定函数进行宽字符到UTF-8的转换,并利用ofstream对象输出,最终实现UTF-8格式文件的生成。

当进行文件写入操作时,会遇到要求文件格式为UTF-8的情况,而写入的文字为宽字符。通常会采用wofstream对象,当然它是可用的,然而生成的文件格式却是ANSI。

ok,这是因为UTF-8与宽字符的编码格式不同导致的。需要将宽字符转换为UTF-8,而后用ofstream输出即可。

static CString ConvertWide2UTF8(CStringW& wideStr)
{
int nChar = ::WideCharToMultiByte(CP_UTF8, 
0, wideStr.GetBuffer(), wideStr.GetLength(), NULL, 0, NULL, NULL);
CString utfStr = "";
::WideCharToMultiByte(CP_UTF8, 
0, wideStr.GetBuffer(), wideStr.GetLength(), utfStr.GetBufferSetLength(nChar), nChar, NULL, NULL);
return utfStr;
}


int main()

{

CStringW  wide = L"哈哈哈";

ofstream fout(D:\\test.txt);

fout << ConvertWide2UTF8(ConvertWide2UTF8);


return 0;

}

此时,输出的文件就是UTF-8了。


附加介绍:

1.  ASCII和Ansi编码
    字符内码(charcter code)指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码,内码分为 
    单字节内码 -- Single-Byte character sets (SBCS),可以支持256个字符编码. 
    双字节内码 -- Double-Byte character sets)(DBCS),可以支持65000个字符编码.
前者即为ASCII编码,后者对应ANSI.
至于简体中文编码GB2312,实际上它是ANSI的一个代码页936

2. Unicode
 如上,ANSI有很多代码页,使用不同代码页的内码无法在其他代码也正常显示,这就是为什么日文版/繁体中文版游戏无法在简体中文平台直接显示的原因.
    Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.它是一种2字节编码,能够提供65536个字符,这个数字是不够表示所有的字符的(汉语就有55000多字符),所以,通过一个代理对的机制来实现附加的917,476个字符表示,以达到所有字符都具有唯一编码.

3.Unicode和BigEndianUnicode
    这两者只是存储顺序不同,如"A"的unicode编码为65 00
    其BigEndianUnicode编码为00 65

4.  UTF-8

    这是为传输而设计的编码,其系列还有UTF-7和UTF-16
    其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
     Unicode编码(16进制)      UTF-8 字节流(二进制) 
     0000 - 007F         0xxxxxxx 
     0080 - 07FF         110xxxxx 10xxxxxx 
     0800 - FFFF         1110xxxx 10xxxxxx 10xxxxxx 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值