(转) C++ Utf8字符转换Gb312编码,解决TinyXml中文乱码
2010-09-21 11:34
253 查看
原文地址:http://cjmxp007.blog.163.com/blog/static/35473837201061541933667/
1 #ifndef TRANSFORM
2 #define TRANSFORM
3 #include <map>
4 using namespace std;
5 // 是否启用map转换,建议启用
6 // 使用map转换的话,同一个常量字符串不会做两次转换
7 #define TEST_TYPE_MAP
8
9 typedef map<const char*, const char*> strmap;
10
11 class CUtf8String
12 {
13 public:
14 inline CUtf8String(const char* gb2312)
15 {
16 m_bIsConst = true;
17 #ifdef TEST_TYPE_MAP
18 if (m[gb2312])
19 {
20 m_utf8 = m[gb2312];
21 return ;
22 }
23 #endif
24 int buffLen = 0;
25 WCHAR wbuff[5120];
26 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wbuff, 5120);
27 buffLen = WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, NULL, 0, 0, 0);
28 m_utf8 = new char[buffLen+1];
29 WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 0, 0);
30 #ifdef TEST_TYPE_MAP
31 m[gb2312] = m_utf8;
32 #endif
33 }
34
35 inline CUtf8String(char* gb2312)
36 {
37 m_bIsConst = false;
38 int buffLen = 0;
39 WCHAR wbuff[5120];
40 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wbuff, 5120);
41 buffLen = WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, NULL, 0, 0, 0);
42 m_utf8 = new char[buffLen+1];
43 WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 0, 0);
44 }
45
46 inline ~CUtf8String()
47 {
48 #ifndef TEST_TYPE_MAP
49 if (m_utf8)
50 {
51 delete m_utf8;
52 m_utf8 = 0;
53 }
54 #else
55 if (!m_bIsConst)
56 {
57 if (m_utf8)
58 {
59 delete m_utf8;
60 m_utf8 = 0;
61 }
62 }
63 #endif
64 }
65
66 inline operator char*()
67 {
68 return (char*)m_utf8;
69 }
70 private:
71 const char* m_utf8;
72 bool m_bIsConst;
73 #ifdef TEST_TYPE_MAP
74 static strmap m;
75 #endif
76 };
77
78 class CGb2312String
79 {
80 public:
81 inline CGb2312String(const char* utf8)
82 {
83 #ifdef TEST_TYPE_MAP
84 if (m[utf8])
85 {
86 m_gb2312 = 0;
87 m_gb2312 = m[utf8];
88 }
89 #endif
90 int buffLen = 0;
91 WCHAR wbuff[5120];
92 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wbuff, 5120);
93 buffLen = WideCharToMultiByte(CP_ACP, 0, wbuff, -1, NULL, 0, 0, 0);
94 m_gb2312 = new char[buffLen+1];
95 WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 0, 0);
96 #ifdef TEST_TYPE_MAP
97 m[utf8] = m_gb2312;
98 #endif
99 }
inline CGb2312String(char* utf8)
{
#ifdef TEST_TYPE_MAP
if (m[utf8])
{
m_gb2312 = 0;
m_gb2312 = m[utf8];
}
#endif
int buffLen = 0;
WCHAR wbuff[5120];
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wbuff, 5120);
buffLen = WideCharToMultiByte(CP_ACP, 0, wbuff, -1, NULL, 0, 0, 0);
m_gb2312 = new char[buffLen+1];
WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 0, 0);
#ifdef TEST_TYPE_MAP
m[utf8] = m_gb2312;
#endif
}
inline ~CGb2312String()
{
#ifndef TEST_TYPE_MAP
if (m_gb2312)
{
delete m_gb2312;
m_gb2312 = 0;
}
#endif
}
inline operator char*()
{
return (char*)m_gb2312;
}
private:
const char* m_gb2312;
#ifdef TEST_TYPE_MAP
static strmap m;
#endif
};
#ifdef TEST_TYPE_MAP
strmap CUtf8String::m;
strmap CGb2312String::m;
#endif
#endif
//===================无聊的分割线==========================
#define U (CUtf8String)
#define W (CGb2312String)
// 使用方法
int main(int argc, char* argv[])
{
// 打印出乱码即为UTF8的编码,方便吧。C++还是确实很强悍的
printf("%s", U"你好中国!");
}
1 #ifndef TRANSFORM
2 #define TRANSFORM
3 #include <map>
4 using namespace std;
5 // 是否启用map转换,建议启用
6 // 使用map转换的话,同一个常量字符串不会做两次转换
7 #define TEST_TYPE_MAP
8
9 typedef map<const char*, const char*> strmap;
10
11 class CUtf8String
12 {
13 public:
14 inline CUtf8String(const char* gb2312)
15 {
16 m_bIsConst = true;
17 #ifdef TEST_TYPE_MAP
18 if (m[gb2312])
19 {
20 m_utf8 = m[gb2312];
21 return ;
22 }
23 #endif
24 int buffLen = 0;
25 WCHAR wbuff[5120];
26 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wbuff, 5120);
27 buffLen = WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, NULL, 0, 0, 0);
28 m_utf8 = new char[buffLen+1];
29 WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 0, 0);
30 #ifdef TEST_TYPE_MAP
31 m[gb2312] = m_utf8;
32 #endif
33 }
34
35 inline CUtf8String(char* gb2312)
36 {
37 m_bIsConst = false;
38 int buffLen = 0;
39 WCHAR wbuff[5120];
40 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wbuff, 5120);
41 buffLen = WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, NULL, 0, 0, 0);
42 m_utf8 = new char[buffLen+1];
43 WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 0, 0);
44 }
45
46 inline ~CUtf8String()
47 {
48 #ifndef TEST_TYPE_MAP
49 if (m_utf8)
50 {
51 delete m_utf8;
52 m_utf8 = 0;
53 }
54 #else
55 if (!m_bIsConst)
56 {
57 if (m_utf8)
58 {
59 delete m_utf8;
60 m_utf8 = 0;
61 }
62 }
63 #endif
64 }
65
66 inline operator char*()
67 {
68 return (char*)m_utf8;
69 }
70 private:
71 const char* m_utf8;
72 bool m_bIsConst;
73 #ifdef TEST_TYPE_MAP
74 static strmap m;
75 #endif
76 };
77
78 class CGb2312String
79 {
80 public:
81 inline CGb2312String(const char* utf8)
82 {
83 #ifdef TEST_TYPE_MAP
84 if (m[utf8])
85 {
86 m_gb2312 = 0;
87 m_gb2312 = m[utf8];
88 }
89 #endif
90 int buffLen = 0;
91 WCHAR wbuff[5120];
92 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wbuff, 5120);
93 buffLen = WideCharToMultiByte(CP_ACP, 0, wbuff, -1, NULL, 0, 0, 0);
94 m_gb2312 = new char[buffLen+1];
95 WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 0, 0);
96 #ifdef TEST_TYPE_MAP
97 m[utf8] = m_gb2312;
98 #endif
99 }
inline CGb2312String(char* utf8)
{
#ifdef TEST_TYPE_MAP
if (m[utf8])
{
m_gb2312 = 0;
m_gb2312 = m[utf8];
}
#endif
int buffLen = 0;
WCHAR wbuff[5120];
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wbuff, 5120);
buffLen = WideCharToMultiByte(CP_ACP, 0, wbuff, -1, NULL, 0, 0, 0);
m_gb2312 = new char[buffLen+1];
WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 0, 0);
#ifdef TEST_TYPE_MAP
m[utf8] = m_gb2312;
#endif
}
inline ~CGb2312String()
{
#ifndef TEST_TYPE_MAP
if (m_gb2312)
{
delete m_gb2312;
m_gb2312 = 0;
}
#endif
}
inline operator char*()
{
return (char*)m_gb2312;
}
private:
const char* m_gb2312;
#ifdef TEST_TYPE_MAP
static strmap m;
#endif
};
#ifdef TEST_TYPE_MAP
strmap CUtf8String::m;
strmap CGb2312String::m;
#endif
#endif
//===================无聊的分割线==========================
#define U (CUtf8String)
#define W (CGb2312String)
// 使用方法
int main(int argc, char* argv[])
{
// 打印出乱码即为UTF8的编码,方便吧。C++还是确实很强悍的
printf("%s", U"你好中国!");
}
相关文章推荐
- C+++Utf8字符转换Gb2312编码,解决TinyXml中文乱码
- 中文环境下安装odoo官方blog模块出现日期转换字符编码出错的解决
- 安装python-mutagen 批量修改mp3字符编码格式,解决Amarok播放器乱码问题
- ANT出现“警告: 编码 GBK 的不可映射字符”解决方法
- 文件编码自动检测转换工具file-convert,解决乱码问题
- 解决中文字符乱码问题,如何将gbk格式转换utf-8格式
- git 路径中文转换成编码的解决
- 修改Visual Studio 2015 Community默认程序文件编码为GB2312暨解决老版本显示乱码或汉字字符报错的方法
- IO流__【转换流的字符编码】【编码与解码】【字符编码-“联通”】
- php函数mult_iconv:对任意维数组转换字符编码(iconv)
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- 解决用MyEclipse导出javadoc文件时出现的(编码 GBK 的不可映射字符)问题
- 结合file和iconv命令转换文件的字符编码类型
- java字符编码转换研究
- QT下中文字符编码的转换
- Excel 手机号码、身份证 等信息 导入到SQL2005 中,转换成字符是自动变成 科学计数法 的解决方法
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- JavaScript 实现字符与unicode编码的相互转换
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换