UNICODE 与 UTF8 的相互转换 (c++)版
2008-03-20 09:27
393 查看
网上找了半天,很麻烦,最后弄得了贴出来方便大家:
void UnicodeToUtf8(char *utf8)
...{
int len = 0;
int size_d = 8;
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, utf8, -1, NULL, 0);
wchar_t *wchar;
wchar = new wchar_t[dwNum];
if(!wchar)
...{
delete []wchar;
}
MultiByteToWideChar (CP_ACP, 0,utf8, -1, wchar, dwNum);
for(int i = 0; i <dwNum; i++)
...{
if ((wchar[i]) < 0x80)
...{ //
utf8[len++] = (char)(wchar[i]);
}
else if((wchar[i]) < 0x800)
...{
utf8[len++] = 0xc0 | ( (*wchar) >> 6 );
utf8[len++] = 0x80 | ( (*wchar) & 0x3f );
}
else if((wchar[i]) < 0x10000 )
...{
utf8[len++] = 0xE0 | ((wchar[i]) >> 12);
utf8[len++] = 0x80 | (((wchar[i])>>6) & 0x3F);
utf8[len++] = 0x80 | ((wchar[i]) & 0x3F);
}
else if((wchar[i]) < 0x200000 )
...{
utf8[len++] = 0xf0 | ( (int)(wchar[i]) >> 18 );
utf8[len++] = 0x80 | ( ((wchar[i]) >> 12) & 0x3f );
utf8[len++] = 0x80 | ( ((wchar[i]) >> 6) & 0x3f );
utf8[len++] = 0x80 | ( (wchar[i]) & 0x3f );
}
}
}
CString UTF8toUnicode(char *s)
...{
int len = 0;
WCHAR* r = new WCHAR[strlen(s) * 2];
while(s[0])
...{
int bytes = 1;
if(s[0] & 0x80)
while(s[0] & (0x80 >> bytes)) bytes++;
if(bytes == 1)
r[len] = s[0];
else
...{
r[len] = 0;
for(char*p = s + (bytes - 1); p > s; p--)
r[len] |= ((*p) & 0x3F) << ((bytes - (p - s) - 1) * 6);
r[len] |= (s[0] & ((1 << (7 - bytes)) - 1)) << ((bytes - 1) * 6);
}
len++;
s += bytes;
}
r[len] = 0;
char*buffer = new char[len * 2 + 1];
ZeroMemory(buffer, len * 2 + 1);
::WideCharToMultiByte(CP_ACP, NULL, r, len, buffer, 1+ 2 * len, NULL, NULL);
CString str = buffer;
delete[] r;
delete[] buffer;
return str;
}
能用 具体再自己改
void UnicodeToUtf8(char *utf8)
...{
int len = 0;
int size_d = 8;
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, utf8, -1, NULL, 0);
wchar_t *wchar;
wchar = new wchar_t[dwNum];
if(!wchar)
...{
delete []wchar;
}
MultiByteToWideChar (CP_ACP, 0,utf8, -1, wchar, dwNum);
for(int i = 0; i <dwNum; i++)
...{
if ((wchar[i]) < 0x80)
...{ //
utf8[len++] = (char)(wchar[i]);
}
else if((wchar[i]) < 0x800)
...{
utf8[len++] = 0xc0 | ( (*wchar) >> 6 );
utf8[len++] = 0x80 | ( (*wchar) & 0x3f );
}
else if((wchar[i]) < 0x10000 )
...{
utf8[len++] = 0xE0 | ((wchar[i]) >> 12);
utf8[len++] = 0x80 | (((wchar[i])>>6) & 0x3F);
utf8[len++] = 0x80 | ((wchar[i]) & 0x3F);
}
else if((wchar[i]) < 0x200000 )
...{
utf8[len++] = 0xf0 | ( (int)(wchar[i]) >> 18 );
utf8[len++] = 0x80 | ( ((wchar[i]) >> 12) & 0x3f );
utf8[len++] = 0x80 | ( ((wchar[i]) >> 6) & 0x3f );
utf8[len++] = 0x80 | ( (wchar[i]) & 0x3f );
}
}
}
CString UTF8toUnicode(char *s)
...{
int len = 0;
WCHAR* r = new WCHAR[strlen(s) * 2];
while(s[0])
...{
int bytes = 1;
if(s[0] & 0x80)
while(s[0] & (0x80 >> bytes)) bytes++;
if(bytes == 1)
r[len] = s[0];
else
...{
r[len] = 0;
for(char*p = s + (bytes - 1); p > s; p--)
r[len] |= ((*p) & 0x3F) << ((bytes - (p - s) - 1) * 6);
r[len] |= (s[0] & ((1 << (7 - bytes)) - 1)) << ((bytes - 1) * 6);
}
len++;
s += bytes;
}
r[len] = 0;
char*buffer = new char[len * 2 + 1];
ZeroMemory(buffer, len * 2 + 1);
::WideCharToMultiByte(CP_ACP, NULL, r, len, buffer, 1+ 2 * len, NULL, NULL);
CString str = buffer;
delete[] r;
delete[] buffer;
return str;
}
能用 具体再自己改
相关文章推荐
- [C/C++]_[utf8和unicode的相互转换]
- [C/C++]_[utf8和unicode的相互转换]
- java中unicode编码和utf8编码相互转换
- MFC 多字节和UNICODE的相互转换(解决中文utf8-ASCNII乱码问题)
- Java实现的utf8,gbk,unicode编码相互转换的代码
- C++中ASCII、unicode与Utf8之间的相互转化
- Java实现的utf8,gbk,unicode编码相互转换的代码
- unicode utf-8 gb2312编码 使用C++相互转换的代码
- UTF8, ASCII, UNICODE相互转换
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入
- Java实现的utf8,gbk,unicode编码相互转换的代码
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
- ANSI、UTF8、UNICODE 相互转换
- [C/C++]_[utf8字符串转换为unicode字符串]
- ANSI, UNICODE与UTF8相互转换模板类
- GB2312、UNICODE和UTF8的相互转换
- pb字符串实现GB2312与Unicode、UTF8之间的相互转换
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入
- [C/C++]_[utf8字符串转换为unicode字符串]
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入文本文件