字符编码各种转换:utf8,unicode
来源:互联网 发布:淘宝网中老年裙裤 编辑:程序博客网 时间:2024/06/02 07:39
原帖地址:http://bbs.csdn.net/topics/320095332我用的是这个:
#include "stdafx.h"#include #include using namespace std;#include "charsetCvt.h"string ws2s(const wstring& ws){string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";setlocale(LC_ALL, "chs"); 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);string result = _Dest;delete []_Dest;setlocale(LC_ALL, curLocale.c_str());return result;} wstring s2ws(const string& s){setlocale(LC_ALL, "chs"); const char* _Source = s.c_str();size_t _Dsize = s.size() + 1;wchar_t *_Dest = new wchar_t[_Dsize];wmemset(_Dest, 0, _Dsize);int nret = mbstowcs(_Dest,_Source,_Dsize);wstring result = _Dest;delete []_Dest;setlocale(LC_ALL, "C"); return result;} wstring UTF2Uni(const char* src, std::wstring &t){if (src == NULL) {return L"";}int size_s = strlen(src);int size_d = size_s + 10; //?wchar_t *des = new wchar_t[size_d];memset(des, 0, size_d * sizeof(wchar_t));int s = 0, d = 0;bool toomuchbyte = true; //set true to skip error prefix.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 t;}int Uni2UTF( const wstring& strRes, char *utf8, int nMaxSize ){if (utf8 == NULL) {return -1;}int len = 0;int size_d = nMaxSize;for (wstring::const_iterator it = strRes.begin(); it != strRes.end(); ++it){wchar_t wchar = *it;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;}string s2utfs(const string& strSrc){string strRes;wstring wstrUni = s2ws(strSrc);char* chUTF8 = new char[wstrUni.length() * 3];memset(chUTF8,0x00,wstrUni.length() * 3);Uni2UTF(wstrUni,chUTF8, wstrUni.length() * 3);strRes = chUTF8;delete []chUTF8;return strRes;}string utfs2s(const string& strutf){wstring wStrTmp;UTF2Uni( strutf.c_str(),wStrTmp);return ws2s(wStrTmp);}
0 0
- 字符编码各种转换:utf8,unicode
- 字符编码转换(utf8-unicode)
- Android的字符编码转换问题,Unicode,GB2312,UTF8等
- Android的字符编码转换问题,Unicode,GB2312,UTF8等
- [参考资料] PB中字符编码转换[ansi, UTF8, Unicode]
- 不同字符编码转换(UTF8 UNICODE ANSI)
- UTF8编码转换成Unicode
- C/C++ 各种字符编码字符串的转换 可用于XML文件的字符转化读写 (收集 GBK - UTF8 - Unicode - ANSI )
- Delphi 转换 UTF8 字符为 Unicode 字符
- 字符编码ansi,utf8,unicode,ascii
- 字符编码【utf8,unicode,ANSI,ascii】
- [py]py字符编码unicode utf8 ascii
- utf8, unicode, gb2312 编码转换vc++
- unicode和utf8编码的互相转换
- ANSI、UNICODE和UTF8之间字符转换
- 字符转换Unicode编码工具
- VC Unicode编码转换为UTF8编码的函数
- 将UTF8编码转换成Unicode(UCS-2)编码
- 罗斯蒙特3051变送器调试工作
- 使用源码编译3D Slicer3的一些注意事项
- window.matchMedia
- 2D Toolkit官方教程翻译
- Google 附近查询 ,关键字
- 字符编码各种转换:utf8,unicode
- java file
- 使用github提交代码
- 最详细的uC/OS-II 移植到STM32
- 【Espruino】NO.16 使用VS1003播放音乐
- 再谈Unity调用Android的Activity
- linux之cut用法
- leetcode 127 Word Ladder
- NSAttributedString的理解