您的位置:首页 > 编程语言 > C语言/C++

(转) 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"你好中国!");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: