转换多字节与UTF-8、Unicode之间的转换

unicode转换  时间:2021-04-12  阅读:()

多字节与UTF-8、 Unicode之间的转换

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

An si字符串我们最熟悉英文占一个字节汉字2个字节 以一个\0结尾常用于txt文本文件

Unicode字符串每个字符(汉字、英文字母)都占2个字节 以2个连续的\0结尾 NT操作系统内核用的是这种字符串常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误其实就是unicode

UTF8是Unicode一种压缩形式英文A在unicode中表示为0x0041 老外觉得这种存储方式太浪费因为浪费了50%的空间于是就把英文压缩成1个字节成了u tf8编码但是汉字在u tf8中占3个字节显然用做中文不如a ns i合算这就是中国的网页用作a n s i编码而老外的网页常用utf8的原因。

UTF8在还游戏里运用的很广泛 比如WOW的lua脚本等

下面来说一下转换主要用代码来说明吧

写文件我用了CFi le类其实用FILE*之类的也是一样写文件和字符串什么类别没有关系硬件只关心数据和长度

Ansi转Unicode

介绍2种方法void CConvertDlg: :OnBnCl ickedButtonAnsiToUnicode()

{

//ansi to unicodechar*szAnsi="abcd1234你我他";

//预转换得到所需空间的大小int wcsLe n =: :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),wszSt ring,wcsLen);

//最后加上'\0'wszString[wcsLen]='\0';

//unicode版的MessageBoxAPI

: :MessageBoxW(GetSafeHwnd(),wszString,wszString,MB_OK);

//接下来写入文本

//写文本文件头2个字节0xfeff低位0xff写在前

CFi lecFi le;cFi le.Open(_T("1 .txt"),CFi le: :modeWrite|CFi le: :modeCreate);

//文件开头cFi le.SeekToBegin();cFi le.Write("\xff\xfe",2);

//写入内容cFi le.Write(wszString,wcsLen*sizeof(wchar_t));cFi le.Flush();cFi le.Close();delete[]wszString;wszSt ring=NULL;

//方法2

//设置当前地域信息不设置的话使用这种方法 中文不会正确显示

//需要#include<locale.h>setlocale(LC_CTYPE, "chs");wchar_t wcsStr[100];

//注意下面是大写S在unicode中代表后面是ansi字符串

//swprintf是sprintf的unicode版本

//格式的前面要加大写L代表是unicodeswprintf(wcsStr, L"%S",szAns i);

: :MessageBoxW(GetSafeHwnd(),wcsStr,wcsStr,MB_OK);

}

Unicode转Ansi

也是2种方法void CConvertDlg: :OnBnCl ickedButtonUnicodeToAnsi()

{

//unicode to ansiwchar_t*wszString=L"abcd1234你我他";

//预转换得到所需空间的大小这次用的函数和上面名字相反int ansiLen =: :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(wszSt ring), szAnsi ,ansiLen,NULL,NULL);

//最后加上'\0'szAnsi[ansiLen]='\0' ;

//Ansi版的MessageBoxAPI

: :MessageBoxA(GetSafeHwnd(),szAnsi ,szAnsi ,MB_OK);

//接下来写入文本

//写文本文件 ANSI文件没有BOM

CFi lecFi le;cFi le.Open(_T("1.txt"),CFi le: :modeWrite|CFi le: :modeCreate);

//文件开头cFi le.SeekToBegin();

//写入内容cFi le.Write(szAnsi ,ansiLen*sizeof(char));cFi le.Flush();cFi le.Close();delete[]szAnsi ;szAnsi=NULL;

//方法2

//和上面一样有另一种方法setlocale(LC_CTYPE, "chs");char szStr[100];

//注意下面是大写在ansi中代表后面是unicode字符串

//sprintfsprintf(szStr, "%S",wszSt ring);

: :MessageBoxA(GetSafeHwnd(),szStr,szStr,MB_OK);

}

Unicode转UTF8void CConvertDlg: :OnBnCl ickedButtonUnicodeToU8()

{

//unicode to UTF8wchar_t*wszString=L"abcd1234你我他";

//预转换得到所需空间的大小这次用的函数和上面名字相反int u 8Len =: :WideCharToMultiByte(CP_UTF8, NULL,wszSt ring,wcslen(wszString),NULL,0,NULL,NULL);

//同上分配空间要给'\0'留个空间

//UTF8虽然是Unicode的压缩形式但也是多字节字符串所以可以以char的形式保存char*szU8=new char[u8Len+1];

//转换

//unicode版对应的strlen是wcslen

: :WideCharToMultiByte(CP_UTF8,NULL,wszSt ring,wcslen(wszString), szU8, u8Len,NULL,NULL);

//最后加上'\0'szU8[u8Len]='\0' ;

//MessageBox不支持UTF8,所以只能写文件

//接下来写入文本

//写文本文件 UTF8的BOM是0xbfbbef

CFi lecFi le;cFi le.Open(_T("1 .txt"),CFi le: :modeWrite|CFi le: :modeCreate);

//文件开头cFi le.SeekToBegin();

//写BOM 同样低位写在前cFi le.Write("\xef\xbb\xbf",3);

//写入内容cFi le.Write(szU8, u8Len*sizeof(char));cFi le.Flush();cFi le.Close();delete[]szU8;szU8=NULL;

}

UTF8转UNICO DEvoid CConvertDlg: :OnBnCl ickedButtonU8ToUnicode()

{

//UTF8 to Unicode

//由于中文直接复制过来会成乱码编译器有时会报错故采用16进制形式char*szU8="abcd 1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";

//预转换得到所需空间的大小int wcsLen=: :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);

//写文本同ansi to unicode

}

An si转换utf8和utf8转换An si就是上面2个的结合把u n icod e作为中间量进行2次转换即可

#include<iostream>

#include<string>

#include<Windows.h>using namespace std;

void unicodeToUTF8(constwstring&src,string&result)

int n=WideCharToMultiByte(CP_UTF8,0,src.c_str(), -1 ,0,0,0,0);result.resize(n);

: :WideCharToMultiByte(CP_UTF8,0,src.c_str(), -1 , (char*)result.c_str(), result. length(),0,0);

void unicodeToGB2312(constwstring&wstr ,string&result)

int n=WideCharToMultiByte(CP_ACP, 0,wstr.c_str(), -1 ,0,0,0,0);result.resize(n);

: :WideCharToMultiByte(CP_ACP, 0,wstr.c_str(), -1 , (char*)result.c_str(), n,0,0);

void utf8ToUnicode(const string&src,wstring&result)

int n=MultiByteToWideChar(CP_UTF8,0,src.c_str(), -1 ,NULL,0);result.resize(n);

: :MultiByteToWideChar(CP_UTF8,0,src.c_str(), -1 , (LPWSTR)result.c_str(), result. len g th());

void gb2312ToUnicode(const string&src,wstring&result)

int n=MultiByteToWideChar(CP_ACP, 0,src.c_str(), -1 ,NULL,0);result.resize(n);

: :MultiByteToWideChar(CP_ACP, 0,src.c_str(), -1 , (LPWSTR)result.c_str(), result. length());

香港云服务器最便宜价格是多少钱一个月、一年?

香港云服务器最便宜价格是多少钱一个月/一年?无论香港云服务器推出什么类型的配置和活动,价格都会一直吸引我们,那么就来说说香港最便宜的云服务器类型和香港最低的云服务器价格吧。香港云服务器最便宜最低价的价格是多少?香港云服务器只是服务器中最受欢迎的产品。香港云服务器有多种配置类型,如1核1G、2核2G、2核4G、8到16核32G等。这些配置可以满足大多数用户的需求,无论是电商站、视频还是游戏、小说等。...

香港服务器多少钱一个月?香港云服务器最便宜价格

香港服务器多少钱一个月?香港服务器租用配置价格一个月多少,现在很多中小型企业在建站时都会租用香港服务器,租用香港服务器可以使网站访问更流畅、稳定性更好,安全性会更高等等。香港服务器的租用和其他地区的服务器租用配置元素都是一样的,那么为什么香港服务器那么受欢迎呢,香港云服务器最便宜价格多少钱一个月呢?阿里云轻量应用服务器最便宜的是1核1G峰值带宽30Mbps,24元/月,288元/年。不过我们一般选...

Virmach 3.23美元可用6个月的VPS主机

Virmach 商家算是比较久且一直在低价便宜VPS方案中玩的不亦乐乎的商家,有很多同时期的商家纷纷关闭转让,也有的转型到中高端用户。而前一段时间也有分享过一次Virmach商家推出所谓的一次性便宜VPS主机,比如很低的价格半年时间,时间到服务器也就关闭。这不今天又看到商家有提供这样的产品。这次的活动产品包括圣何塞和水牛城两个机房,为期六个月,一次性付费用完将会取消,就这么特别的产品,适合短期玩玩...

unicode转换为你推荐
您的appleasp.net网页制作ASP.NET设计网页的方法?flashfxp注册码谁知道 FlashFXP.rar的注册码?govyatumblr上不去为什么,爱看软件打不开?页面一直在加载电子商务世界世界第一的电子商务网站???oa办公软件价格一个oa系统多少钱400电话查询400电话。如何查询真伪,费用?什么是seo学习SEO的好处是什么?本帖隐藏的内容怎么设置本帖隐藏的内容需要回复才可以浏览
万网域名证书查询 香港加速器 分销主机 mediafire下载工具 la域名 免费ftp空间 网络星期一 e蜗 免费个人空间 789电视 国外代理服务器软件 流量计费 网络空间租赁 免费phpmysql空间 申请网页 上海电信测速 中国linux 万网空间 学生机 winserver2008 更多