`
king_tt
  • 浏览: 2113009 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Ansi、Unicode、UTF8等编码字符串之间的转换和写入文本文件(学习中……)

 
阅读更多
Ansi、Unicode、UTF8字符串之间的转换和写入文本文件

最近有人问我关于这个的问题,就此写一篇blog

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种方法

voidCConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
//ansitounicode
char*szAnsi="abcd1234你我他";
//预转换,得到所需空间的大小
intwcsLen=::MultiByteToWideChar(CP_ACP,NULL,szAnsi,strlen(szAnsi),NULL,0);
//分配空间要给'/0'留个空间,MultiByteToWideChar不会给'/0'空间
wchar_t*wszString=newwchar_t[wcsLen+1];
//转换
::MultiByteToWideChar(CP_ACP,NULL,szAnsi,strlen(szAnsi),wszString,wcsLen);
//最后加上'/0'
wszString[wcsLen]='/0';
//unicode版的MessageBoxAPI
::MessageBoxW(GetSafeHwnd(),wszString,wszString,MB_OK);

//接下来写入文本
//写文本文件,头2个字节0xfeff,低位0xff写在前
CFilecFile;
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_twcsStr[
100];
//注意下面是大写S,在unicode中,代表后面是ansi字符串
//swprintf是sprintf的unicode版本
//格式的前面要加大写L,代表是unicode
swprintf(wcsStr,L"%S",szAnsi);
::MessageBoxW(GetSafeHwnd(),wcsStr,wcsStr,MB_OK);

}



Unicode转Ansi
也是2种方法

voidCConvertDlg::OnBnClickedButtonUnicodeToAnsi()
{
//unicodetoansi
wchar_t*wszString=L"abcd1234你我他";
//预转换,得到所需空间的大小,这次用的函数和上面名字相反
intansiLen=::WideCharToMultiByte(CP_ACP,NULL,wszString,wcslen(wszString),NULL,0,NULL,NULL);
//同上,分配空间要给'/0'留个空间
char*szAnsi=newchar[ansiLen+1];
//转换
//unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_ACP,NULL,wszString,wcslen(wszString),szAnsi,ansiLen,NULL,NULL);
//最后加上'/0'
szAnsi[ansiLen]='/0';
//Ansi版的MessageBoxAPI
::MessageBoxA(GetSafeHwnd(),szAnsi,szAnsi,MB_OK);

//接下来写入文本
//写文本文件,ANSI文件没有BOM
CFilecFile;
cFile.Open(_T(
"1.txt"),CFile::modeWrite|CFile::modeCreate);
//文件开头
cFile.SeekToBegin();
//写入内容
cFile.Write(szAnsi,ansiLen*sizeof(char));
cFile.Flush();
cFile.Close();
delete[]szAnsi;
szAnsi
=NULL;


//方法2
//和上面一样有另一种方法
setlocale(LC_CTYPE,"chs");
charszStr[100];
//注意下面是大写,在ansi中,代表后面是unicode字符串
//sprintf
sprintf(szStr,"%S",wszString);
::MessageBoxA(GetSafeHwnd(),szStr,szStr,MB_OK);
}



Unicode转UTF8

voidCConvertDlg::OnBnClickedButtonUnicodeToU8()
{
//unicodetoUTF8
wchar_t*wszString=L"abcd1234你我他";
//预转换,得到所需空间的大小,这次用的函数和上面名字相反
intu8Len=::WideCharToMultiByte(CP_UTF8,NULL,wszString,wcslen(wszString),NULL,0,NULL,NULL);
//同上,分配空间要给'/0'留个空间
//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
char*szU8=newchar[u8Len+1];
//转换
//unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_UTF8,NULL,wszString,wcslen(wszString),szU8,u8Len,NULL,NULL);
//最后加上'/0'
szU8[u8Len]='/0';
//MessageBox不支持UTF8,所以只能写文件

//接下来写入文本
//写文本文件,UTF8的BOM是0xbfbbef
CFilecFile;
cFile.Open(_T(
"1.txt"),CFile::modeWrite|CFile::modeCreate);
//文件开头
cFile.SeekToBegin();
//写BOM,同样低位写在前
cFile.Write("/xef/xbb/xbf",3);
//写入内容
cFile.Write(szU8,u8Len*sizeof(char));
cFile.Flush();
cFile.Close();
delete[]szU8;
szU8
=NULL;

}


UTF8转UNICODE

voidCConvertDlg::OnBnClickedButtonU8ToUnicode()
{
//UTF8toUnicode
//由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式
char*szU8="abcd1234/xe4/xbd/xa0/xe6/x88/x91/xe4/xbb/x96/x00";
//预转换,得到所需空间的大小
intwcsLen=::MultiByteToWideChar(CP_UTF8,NULL,szU8,strlen(szU8),NULL,0);
//分配空间要给'/0'留个空间,MultiByteToWideChar不会给'/0'空间
wchar_t*wszString=newwchar_t[wcsLen+1];
//转换
::MultiByteToWideChar(CP_UTF8,NULL,szU8,strlen(szU8),wszString,wcsLen);
//最后加上'/0'
wszString[wcsLen]='/0';
//unicode版的MessageBoxAPI
::MessageBoxW(GetSafeHwnd(),wszString,wszString,MB_OK);

//写文本同ansitounicode
}



Ansi转换utf8和utf8转换Ansi就是上面2个的结合,把unicode作为中间量,进行2次转换即可
=======================================================================

转载声明:本文转自http://www.cppblog.com/greatws/archive/2008/08/31/60546.html

分享到:
评论

相关推荐

    VC中字符串之间的转换和写入文本

    VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本

    rar压缩软件.rar

    在 e:\text 目录下的 rar 压缩文件中搜索十六进制字符串 f0 e0 ae ae ab 2d 83 e3 a9。 k 锁定压缩文件。任何试图改变压缩文件的命令都会被忽略。 例子: rar k final.rar l[t[a],b] 压缩文件的内容列表...

    WINRAR5.0正式注册版

    UTF-16 小端字节序编码被用于 RAR 和 WinRAR 日志文件 rar.log 中,所以 Unicode 文件名能在日志文件中正确存储。WinRAR 会自动删除非 Unicode 格式的旧 rar.log 文件来避免同一日志文件中混合不同的编码。...

    精易模块[源码] V5.15

    3、新增“编码_Ansi到十进制_文本型”此代码由易友【菜虫】提供,将Ansi码转换为十进制,如:将“精易论坛”转换后将返回格式如:“&#48811&#53975&#49883&#52403”。 4、新增“目录_取运行目录”取当前被执行的易...

    精易官方免费模块v3.60版

    3、增加“编码_U编码转换”命令 4、增加“音乐_播放”,“音乐_暂停”,“音乐_停止”命令 5、增加“文本_朗读”命令 1、改进“网页_验证码读取”添加“附加协议头”的参数,感谢会员 提百万 的建议 2、改进“系统_...

    MySQL 5.1中文手冊

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    mysql官方中文参考手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    MYSQL中文手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果...

    MySQL 5.1参考手册中文版

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果...

    MySQL 5.1参考手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    MySQL 5.1参考手册 (中文版)

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    php网络开发完全手册

    11.4.1 编码字符串——urlencode 181 11.4.2 解码字符串——urldecode 181 11.5 小结 182 第12章 PHP与JavaScript交互 183 12.1 JavaScript简介 183 12.2 JavaScript的数据类型 183 12.3 JavaScript程序设计基础 184...

    MySQL5.1参考手册官方简体中文版

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    MySQL 5.1官方简体中文参考手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    项目中处理Error Msg的方法

    缺点:跨平台交互不容易,尤其是文件内码不同的情况,比如utf-8环境、ansi char环境、unicode环境........... 2. 写入xml文件里面:(推荐) 这种做法和上述方法类似,不过解决了上述方法的缺点。常用于Web相关的...

    mysql5.1中文手册

    字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对...

Global site tag (gtag.js) - Google Analytics