字符串UTF-8和GBK之间的转换以及判定
一、判定字符串是否是UTF-8的编码
bool is_str_utf8(const char* str)
{
unsigned int nBytes = ;//UFT8可用1-6个字节编码,ASCII用一个字节
unsigned char chr = *str;
bool bAllAscii = true; for (unsigned int i = ; str[i] != '\0'; ++i)
{
chr = *(str + i);
//判断是否ASCII编码,如果不是,说明有可能是UTF8,ASCII用7位编码,最高位标记为0,0xxxxxxx
if (nBytes == && (chr & 0x80) != )
{
bAllAscii = false;
} if (nBytes == )
{
//如果不是ASCII码,应该是多字节符,计算字节数
if (chr >= 0x80)
{
if (chr >= 0xFC && chr <= 0xFD)
{
nBytes = ;
}
else if (chr >= 0xF8)
{
nBytes = ;
}
else if (chr >= 0xF0)
{
nBytes = ;
}
else if (chr >= 0xE0)
{
nBytes = ;
}
else if (chr >= 0xC0)
{
nBytes = ;
}
else
{
return false;
}
nBytes--;
}
}
else
{
//多字节符的非首字节,应为 10xxxxxx
if ((chr & 0xC0) != 0x80)
{
return false;
}
//减到为零为止
nBytes--;
}
} //违返UTF8编码规则
if (nBytes != )
{
return false;
} if (bAllAscii)
{ //如果全部都是ASCII, 也是UTF8
return true;
} return true;
}
二、判定字符串是否是GBk的编码
bool is_str_gbk(const char* str)
{
unsigned int nBytes = ;//GBK可用1-2个字节编码,中文两个 ,英文一个
unsigned char chr = *str;
bool bAllAscii = true; //如果全部都是ASCII, for (unsigned int i = ; str[i] != '\0'; ++i)
{
chr = *(str + i);
if ((chr & 0x80) != && nBytes == )
{// 判断是否ASCII编码,如果不是,说明有可能是GBK
bAllAscii = false;
} if (nBytes == )
{
if (chr >= 0x80)
{
if (chr >= 0x81 && chr <= 0xFE)
{
nBytes = +;
}
else
{
return false;
}
nBytes--;
}
}
else
{
if (chr < 0x40 || chr>0xFE)
{
return false;
}
nBytes--;
}//else end
} if (nBytes != )
{ //违返规则
return false;
} if (bAllAscii)
{ //如果全部都是ASCII, 也是GBK
return true;
} return true;
}
三、字符串由GBk编码转换成UTF-8编码
void ConvertGBKToUtf8(CString &strGBK)
{
int len=MultiByteToWideChar(CP_ACP, , (LPCTSTR)strGBK, -, NULL,);
wchar_t * wszUtf8 = new wchar_t [len];
memset(wszUtf8, , len);
MultiByteToWideChar(CP_ACP, , (LPCTSTR)strGBK, -, wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, , wszUtf8, -, NULL, , NULL, NULL);
char *szUtf8=new char[len + ];
memset(szUtf8, , len + );
WideCharToMultiByte (CP_UTF8, , wszUtf8, -, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
} string GBKToUTF8(const char* strGBK)
{
int len = MultiByteToWideChar(CP_ACP, , strGBK, -, NULL, );
wchar_t* wstr = new wchar_t[len+];
memset(wstr, , len+);
MultiByteToWideChar(CP_ACP, , strGBK, -, wstr, len);
len = WideCharToMultiByte(CP_UTF8, , wstr, -, NULL, , NULL, NULL);
char* str = new char[len+];
memset(str, , len+);
WideCharToMultiByte(CP_UTF8, , wstr, -, str, len, NULL, NULL);
string strTemp = str;
if(wstr) delete[] wstr;
if(str) delete[] str;
return strTemp;
}
四、字符串由UTF-8编码转换成GBk编码
string UtfToGbk(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, , utf8, -, NULL, );
wchar_t* wstr = new wchar_t[len+];
memset(wstr, , len+);
MultiByteToWideChar(CP_UTF8, , utf8, -, wstr, len);
len = WideCharToMultiByte(CP_ACP, , wstr, -, NULL, , NULL, NULL);
char* str = new char[len+];
memset(str, , len+);
WideCharToMultiByte(CP_ACP, , wstr, -, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
} bool Utf82gbk(std::string &gbkStr, std::string &srcStr)
{ //首先先将utf-8编码转换为unicode编码
if(NULL==setlocale(LC_ALL,"zh_CN.utf8"))//设置转换为unicode前的码,当前为utf8编码
{
printf("Bad Parameter\n");
return false;
} int unicodeLen=mbstowcs(NULL,srcStr.c_str(),);//计算转换后的长度
if(unicodeLen<=)
{
printf("Can not Transfer!!!\n");
return false;
}
wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+);
mbstowcs(unicodeStr,srcStr.c_str(),srcStr.size());//将gbk转换为unicode //将unicode编码转换为gbk编码
if(NULL==setlocale(LC_ALL,"zh_CN.gbk"))//设置unicode转换后的码,当前为gbk
{
printf("Bad Parameter\n");
return false;
}
int gbkLen = wcstombs(NULL,unicodeStr,);//计算转换后的长度
if(gbkLen<=)
{
printf("Can not Transfer!!!\n");
return false;
}
char gbkbuf[*];
wcstombs(gbkbuf,unicodeStr,gbkLen);
gbkbuf[gbkLen]=;//添加结束符
gbkStr = gbkbuf;
free(unicodeStr);
return true;
} string UTF8ToGBK(const std::string& strUTF8)
{
int len = MultiByteToWideChar(CP_UTF8, , strUTF8.c_str(), -, NULL, );
WCHAR* wszGBK = new WCHAR[len+];
memset(wszGBK, , len * + );
MultiByteToWideChar(CP_UTF8, , (LPCSTR)(LPCTSTR)strUTF8.c_str(), -, wszGBK, len); len = WideCharToMultiByte(CP_ACP, , wszGBK, -, NULL, , NULL, NULL);
char *szGBK = new char[len + ];
memset(szGBK, , len + );
WideCharToMultiByte(CP_ACP,, wszGBK, -, szGBK, len, NULL, NULL);
std::string strTemp(szGBK);
delete[]szGBK;
delete[]wszGBK;
return strTemp;
}
字符串UTF-8和GBK之间的转换以及判定的更多相关文章
- C++常用字符串操作和UTF-8和GBK之间的转换以及判定(转)
编码转换原文地址:https://www.cnblogs.com/Toney-01-22/p/9935297.html C++字符串常用操作:C++ 中字符串查找.字符串截取.字符串替换
- UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE,GBK 之间的转换
Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持.Unicode.org官方对Unicode的定义是:Unicode provides a unique ...
- UTF8 & GBK之间的转换
使用lua的时候,在lua中给字符串赋值的中文,但是在C中读出来的就是乱码,是因为在lua中使用的是UTF8编码,而在C(windows下面)中使用的是GBK编码,将UTF8转成GBK就可以了,下面的 ...
- [转]Json字符串和map和HashMap之间的转换
需要导入alibaba.fastJsonmaven中的依赖为 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> ...
- 【转】c#、wpf 字符串,color,brush之间的转换
转自:http://www.cnblogs.com/wj-love/archive/2012/09/14/2685281.html 1,将#3C3C3C 赋给background this.selec ...
- angular2 ----字符串、对象、base64 之间的转换
1. JSON对象转化为字符串 let obj = { "name":Ayinger; "sex":"女"; } let str = JSO ...
- 【C语言】字符串与整型数值之间的转换
一.将字符串转化为对应的数值 /*============================================================================= # # F ...
- JavaScript中字符串与16进制之间的转换
一.字符串转换为16进制 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 常见的时间字符串与timestamp之间的转换 时间戳
这里说的字符串不是一般意义上的字符串,是指在读取日期类型的数据时,如果还没有及时解析字符串,它就还不是日期类型,那么此时的字符串该怎么与时间戳之间进行转换呢? ① 时间字符串转化成时间戳 将时间字符串 ...
随机推荐
- JPA 常用注解
@Entity(name=”EntityName”):必须,name为可选,对应数据库中一的个表 @Table(name=””,catalog=””,schema=””):可选 通常和@Entity配 ...
- 进程无法连接到 Subscriber"XXXXXXX"
进程无法连接到 Subscriber“APP07”. 在订阅的机器上config 添加别名 APP07
- win7安装SQL Server 2005 的问题总结
SQL Server 安装程序无法连接到数据库服务进行服务器配置. 错误为: [Microsoft][SQL Native Client]客户端不支持加密. 有关详细信息,请参阅服务器错误日志和安装日 ...
- JSP页面取不到ModelAndView里面存的值
方法1:在jsp页面上加上<%@ page isELIgnored="false" %>
- 忽略npm install安装失败信息
在package.json目录下运行npm install命令时会提示某些模块安装失败,如下图所示: 不管你在.npmrc文件中设置了proxy.https-proxy和registry地址,它还 ...
- Qt Gui 第六章布局管理
1.QRadioButton之间如何互斥 其中一种方法是将各个QRadioButton控件放在同一个toolbarsLayout或者toolbarsGroupBox即可:如下所示 toolbarsGr ...
- ntoskrnl.exe导致蓝屏解决方法
背景 博主电脑近段时间经常蓝屏,主要表现在开关机.重启等操作上: 使用 BlueScreenView 查看C:\Windows\Minidump下的bmp文件,关键信息如下: 解决方法 查阅网上的各种 ...
- Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class 消费者提示需要配置数据源
使用 由于给前端做分页 在启动消费者的时候遇到了这个问题 Failed to configure a DataSource: 'url' attribute is not specified and ...
- python2.6升级python2.7后,yum不能用了,如何解决
背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...
- php7 安装redis拓展
配置之前应该是环境已经搭好了,phpinfo的页面可以加载出来. 使用git clone下载git上的phpredis扩展包 git clone https://github.com/phpre ...