VC中Ansi、Unicode、UTF8字符串转换与写入
本文主要介绍了在VC++环境中如何进行Ansi、Unicode和UTF8字符串之间的转换以及将这些字符串写入文本文件。Unicode是一种通用的字符编码标准,它能表示多种语言的字符,而UTF8是Unicode的一种编码实现,以字节序列的形式存储Unicode字符。在VC++中,处理字符串时需要理解不同编码之间的转换方法。 在Windows操作系统中,Unicode通常以UTF-16LE(小端序)的形式存在,即每个Unicode字符由两个字节表示,且前导字节是0。VC++中,`wchar_t`类型就是用来存储这种双字节的Unicode字符。当需要将Ansi字符串(ASCII扩展的单字节编码)转换为Unicode时,可以使用`MultiByteToWideChar`函数,指定`CP_ACP`代码页,将Ansi字符串转换为宽字符字符串(Unicode)。 在示例代码中,`OnBnClickedButtonAnsiToUnicode`函数演示了Ansi到Unicode的转换过程。首先计算Ansi字符串转换后的Unicode字符串长度,然后分配内存存储宽字符字符串,接着调用`MultiByteToWideChar`进行实际转换,并在转换后添加结束的空字符`\0`。最后,将Unicode字符串写入一个名为"1.txt"的文件中,为了标识这是一个Unicode文件,会在文件开头写入字节序标记BOM(Byte Order Mark),对于UTF-16LE,BOM是`"\xFF\xFE"`。 如果需要将Unicode字符串转换为UTF8,可以使用`WideCharToMultiByte`函数,指定`CP_UTF8`代码页。UTF8编码可以更高效地存储大部分常见的英文字符,因为它们只需要1个字节表示,而对于Unicode中的其他字符,UTF8可能需要2至4个字节。在转换过程中,需要注意字符数量和字节大小的区别,UTF8编码的字节数通常会比Unicode的字节数多。 在写入文件时,如果需要将Unicode字符串写入UTF8格式的文本文件,需要先进行Unicode到UTF8的转换,然后再写入文件。此过程不包含在给出的示例代码中,但可以通过类似的逻辑实现。 理解和熟练运用这些转换函数是VC++开发中处理多语言文本的关键,尤其是在与跨平台的程序或库交互时,如WOWlua这类游戏脚本系统,正确地转换和处理字符串编码可以避免很多兼容性问题。
Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,NT操作系统内核用的是这种字符串,常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误,其实就是unicode
UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算,这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。
UTF8在还游戏里运用的很广泛,比如WOW的lua脚本等
下面来说一下转换,主要用代码来说明吧
写文件我用了CFile类,其实用FILE*之类的也是一样,写文件和字符串什么类别没有关系,硬件只关心数据和长度
Ansi转Unicode
介绍2种方法
void CConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
// ansi to unicode
char* szAnsi = "abcd1234你我他";
//预转换,得到所需空间的大小
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0';
//unicode版的MessageBox API
::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);
//接下来写入文本
//写文本文件,头2个字节0xfeff,低位0xff写在前
cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);
//文件开头
cFile.SeekToBegin();
cFile.Write("\xff\xfe", 2);
//写入内容
cFile.Write(wszString, wcsLen * sizeof(wchar_t));
cFile.Flush();
cFile.Close();
delete[] wszString;
wszString =NULL;
//方法2
//设置当前地域信息,不设置的话,使用这种方法,中文不会正确显示
//需要#include<locale.h>
setlocale(LC_CTYPE, "chs");
wchar_t wcsStr[100];
//注意下面是大写S,在unicode中,代表后面是ansi字符串
//swprintf是sprintf的unicode版本
//格式的前面要加大写L,代表是unicode
swprintf(wcsStr, L"%S", szAnsi);
::MessageBoxW(GetSafeHwnd(), wcsStr, wcsStr, MB_OK);
}
Unicode转Ansi
也是2种方法
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦