跨平台:utf8与Unicode、string与wstring相互转换【经验】
来源:互联网 发布:淘宝同行低价恶意竞争 编辑:程序博客网 时间:2024/06/01 09:51
废话不多说,直接上代码!!亲测,可用!!
/******************************************************* 函数名称:UTF2Uni 函数功能:utf-8转Unicode(跨平台) 输入参数: src:utf-8编码格式的字符指针 t:Unicode编码格式的宽字符串 输出参数:无 返 回 值:0表示执行成功*******************************************************/int UTF2Uni(const char* src, std::wstring &t){ if (src == NULL) { return -1; } int size_s = strlen(src); int size_d = size_s * 2; wchar_t *des = new wchar_t[size_d]; memset(des, 0, size_d * sizeof(wchar_t)); int s = 0, d = 0; //设为true时,跳过错误前缀 bool toomuchbyte = true; while (s < size_s && d < size_d) { unsigned char c = src[s]; if ((c & 0x80) == 0) { des[d++] += src[s++]; } else if((c & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx { WCHAR &wideChar = des[d++]; wideChar = (src[s + 0] & 0x3F) << 6; wideChar |= (src[s + 1] & 0x3F); s += 2; } else if((c & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx { WCHAR &wideChar = des[d++]; wideChar = (src[s + 0] & 0x1F) << 12; wideChar |= (src[s + 1] & 0x3F) << 6; wideChar |= (src[s + 2] & 0x3F); s += 3; } else if((c & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx { WCHAR &wideChar = des[d++]; wideChar = (src[s + 0] & 0x0F) << 18; wideChar = (src[s + 1] & 0x3F) << 12; wideChar |= (src[s + 2] & 0x3F) << 6; wideChar |= (src[s + 3] & 0x3F); s += 4; } else { WCHAR &wideChar = des[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx wideChar = (src[s + 0] & 0x07) << 24; wideChar = (src[s + 1] & 0x3F) << 18; wideChar = (src[s + 2] & 0x3F) << 12; wideChar |= (src[s + 3] & 0x3F) << 6; wideChar |= (src[s + 4] & 0x3F); s += 5; } } t = des; delete[] des; des = NULL; return 0;} /******************************************************* 函数名称:Uni2UTF 函数功能:Unicode转utf-8(跨平台) 输入参数: wchar:Unicode编码格式的宽字符数组 utf8:utf-8编码格式的字符指针 输出参数:无 返 回 值:utf-8编码格式的字符指针长度*******************************************************/int Uni2UTF(wchar_t wchar, char *utf8){ if (utf8 == NULL) { return -1; } int len = 0; int size_d = 8; if (wchar < 0x80) { // //length = 1; utf8[len++] = (char)wchar; } else if(wchar < 0x800) { //length = 2; if (len + 1 >= size_d) return -1; utf8[len++] = 0xc0 | ( wchar >> 6 ); utf8[len++] = 0x80 | ( wchar & 0x3f ); } else if(wchar < 0x10000 ) { //length = 3; if (len + 2 >= size_d) return -1; utf8[len++] = 0xe0 | ( wchar >> 12 ); utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f ); utf8[len++] = 0x80 | ( wchar & 0x3f ); } else if( wchar < 0x200000 ) { //length = 4; if (len + 3 >= size_d) return -1; utf8[len++] = 0xf0 | ( (int)wchar >> 18 ); utf8[len++] = 0x80 | ( (wchar >> 12) & 0x3f ); utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f ); utf8[len++] = 0x80 | ( wchar & 0x3f ); } return len;}/******************************************************* 函数名称:s2ws 函数功能:string转wstring(跨平台),不涉及编码格式的转换 输入参数: s:Unicode编码格式的string 输出参数:无 返 回 值:Unicode编码格式的wstring*******************************************************/std::wstring s2ws(const std::string& s){ #if (defined WIN32) || (defined _WIN32) setlocale(LC_ALL,"chs"); #else setlocale(LC_ALL,"zh_CN.gbk"); #endif const char* _Source = s.c_str(); size_t _Dsize = s.size() + 1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); mbstowcs(_Dest,_Source,_Dsize); std::wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, "C"); return result;}/******************************************************* 函数名称:ws2s 函数功能:wstring转string(跨平台),不涉及编码格式的转换 输入参数: ws:Unicode编码格式的wstring 输出参数:无 返 回 值:Unicode编码格式的string*******************************************************/std::string ws2s(const std::wstring& ws){ std::string curLocale = setlocale(LC_ALL, NULL); #if (defined WIN32) || (defined _WIN32) setlocale(LC_ALL,"chs"); #else setlocale(LC_ALL,"zh_CN.gbk"); #endif const wchar_t* _Source = ws.c_str(); size_t _Dsize = 2 * ws.size() + 1; char *_Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); wcstombs(_Dest,_Source,_Dsize); std::string result = _Dest; delete []_Dest; setlocale(LC_ALL, curLocale.c_str()); return result;}
阅读全文
0 0
- 跨平台:utf8与Unicode、string与wstring相互转换【经验】
- wstring与string相互转换
- wstring与string相互转换
- string与wstring的相互转换
- Unicode与String相互转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- string与wstring转换
- 常用字符转换 string wstring utf8 unicode ascii
- utf8与unicode转换
- utf8与unicode转换
- utf8与unicode转换
- Unicode与UTF8相互转化
- spark读取hdfs异常记录
- 20、状态模式(State)
- 大话设计模式读书笔记之单例模式
- 正则表达式 -转义字符
- 房间SDK接入方案(Android)
- 跨平台:utf8与Unicode、string与wstring相互转换【经验】
- IT运维人员避免和应对危机的五种方式
- C++对C的扩展
- 强行开洞
- __name__内置变量
- 第四章 虚拟机类加载
- C语言学习历程(五)define、inline的区别及特点
- 设计模式【拦截过滤器模式InterceptingFileterPattern】
- 支付宝接口开发