CString与utf-8互转及其他类型转换

//string类型的utf-8字符串转为CString类型的unicode字符串
CString ConvertUTF8ToCString( std::string utf8str )
{
    /* 预转换,得到所需空间的大小 */
    int nLen = ::MultiByteToWideChar( CP_UTF8, NULL,
                      utf8str.data(), utf8str.size(), NULL, 0 );
    /* 转换为Unicode */
    std::wstring wbuffer;
    wbuffer.resize( nLen );
    ::MultiByteToWideChar( CP_UTF8, NULL, utf8str.data(), utf8str.size(),
                   (LPWSTR) (wbuffer.data() ), wbuffer.length() );

#ifdef UNICODE
    return(CString( wbuffer.data(), wbuffer.length() ) );
#else
    /*
     * 转换为ANSI
     * 得到转换后长度
     */
    nLen = WideCharToMultiByte( CP_ACP, 0,
                    wbuffer.data(), wbuffer.length(), NULL, 0, NULL, NULL );

    std::string ansistr;
    ansistr.resize( nLen );

    /* 把unicode转成ansi */
    WideCharToMultiByte( CP_ACP, 0, (LPWSTR) (wbuffer.data() ), wbuffer.length(),
                 (LPSTR) (ansistr.data() ), ansistr.size(), NULL, NULL );
    return(CString( ansistr.data(), ansistr.length() ) );
#endif
}
//CString类型的unicode字符串转为string类型的utf-8字符串
string _UnicodeToUtf8(CString Unicodestr)
{
        wchar_t* unicode = Unicodestr.AllocSysString();
	int len;
	len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
	char *szUtf8 = (char*)malloc(len + 1);
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
	string result = szUtf8;
	free(szUtf8);
	return result;
}
//string转const char*
string str = "abc";
const char* result= str.c_str();
//CString转char*
CString str;
USES_CONVERSION;
char * result= T2A(str);
//判断字符是否为UTF-8编码方式,是就返回true,否则返回false
bool _is_str_utf8(string src)
{
    const char* str= src.c_str();
	unsigned int nBytes = 0;//UFT8可用1-6个字节编码,ASCII用一个字节
	unsigned char chr = *str;
	bool bAllAscii = true;
	for (unsigned int i = 0; str[i] != '\0'; ++i){
		chr = *(str + i);
		//判断是否ASCII编码,如果不是,说明有可能是UTF8,ASCII用7位编码,最高位标记为0,0xxxxxxx
		if (nBytes == 0 && (chr & 0x80) != 0){
			bAllAscii = false;
		}
		if (nBytes == 0) {
			//如果不是ASCII码,应该是多字节符,计算字节数
			if (chr >= 0x80) {
				if (chr >= 0xFC && chr <= 0xFD){
					nBytes = 6;
				}
				else if (chr >= 0xF8){
					nBytes = 5;
				}
				else if (chr >= 0xF0){
					nBytes = 4;
				}
				else if (chr >= 0xE0){
					nBytes = 3;
				}
				else if (chr >= 0xC0){
					nBytes = 2;
				}
				else{
					return false;
				}
				nBytes--;
			}
		}
		else{
			//多字节符的非首字节,应为 10xxxxxx
			if ((chr & 0xC0) != 0x80){
				return false;
			}
			//减到为零为止
			nBytes--;
		}
	}
	//违反UTF8编码规则
	if (nBytes != 0) {
		return false;
	}
	if (bAllAscii){ //如果全部都是ASCII, 也是UTF8
		return true;
	}
	return true;
}
//string转CString
string str = "1234";
CString result = CString(str.c_str());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值