VC++ UTF-8与GBK格式转换

摘要:
1//注意:多字节包括GBK和UTF-82intGBK2UTF8(char*szGbk,char*szUtf8,intLen)3{4//将多字节GBK(CP_ACP或ANSI)转换为宽字符UTF-165//转换后,所需的内存字符数6intn=MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);7//将字符数乘以sizeof(WCHAR),得到字节数8WC
 1 // 注释:多字节包括GBK和UTF-8  
 2 int GBK2UTF8(char *szGbk,char *szUtf8,int Len)  
 3 {  
 4     // 先将多字节GBK(CP_ACP或ANSI)转换成宽字符UTF-16  
 5     // 得到转换后,所需要的内存字符数  
 6     int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);  
 7     // 字符数乘以 sizeof(WCHAR) 得到字节数  
 8     WCHAR *str1 = new WCHAR[sizeof(WCHAR) * n];  
 9     // 转换  
10     MultiByteToWideChar(CP_ACP,  // MultiByte的代码页Code Page  
11         0,            //附加标志,与音标有关  
12         szGbk,        // 输入的GBK字符串  
13         -1,           // 输入字符串长度,-1表示由函数内部计算  
14         str1,         // 输出  
15         n             // 输出所需分配的内存  
16         );  
17   
18     // 再将宽字符(UTF-16)转换多字节(UTF-8)  
19     n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);  
20     if (n > Len)  
21     {  
22         delete[]str1;  
23         return -1;  
24     }  
25     WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL);  
26     delete[]str1;  
27     str1 = NULL;  
28   
29     return 0;  
30 }  
 1 //UTF-8 GBK  
 2 int UTF82GBK(char *szUtf8,char *szGbk,int Len)  
 3 {  
 4     int n = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0);  
 5     WCHAR * wszGBK = new WCHAR[sizeof(WCHAR) * n];  
 6     memset(wszGBK, 0, sizeof(WCHAR) * n);  
 7     MultiByteToWideChar(CP_UTF8, 0,szUtf8,-1, wszGBK, n);  
 8   
 9     n = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);  
10     if (n > Len)  
11     {  
12         delete[]wszGBK;  
13         return -1;  
14     }  
15   
16     WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGbk, n, NULL, NULL);  
17   
18     delete[]wszGBK;  
19     wszGBK = NULL;  
20   
21     return 0;  
22 }

免责声明:文章转载自《VC++ UTF-8与GBK格式转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库中触发器before与after认识Magento学习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java处理不同的字符编码流

在实际开发中,可能会处理一些文本信息,我们可能使用 BufferedReader bfr = new BufferedReader(new InputStreamReader(bis,encoding)); 这样的方式来处理输入流,然后就可以一行一行的处理信息了。 但是,这里的encoding一般都不会确定,有的是GBK格式,有的是UTF-8格式,可能还有...

几种编码方式

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:问题一:使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?...

C#-获取字符的GBK编码值

public static int GetGBKValue(string key) { byte[] gbk = Encoding.GetEncoding("GBK").GetBytes(key); string code = ""; foreach (byte b in gbk)...

NodeJS笔记:处理非utf8编码

最近研究了下nodejs读写GBK文件的方法,nodejs原生的API接口如 fs.readFile(filename,[encoding],[callback]) 其encoding参数是不支持gbk的。实际上,如果不传encoding参数,返回的结果是一个Buffer类型的对象;如果传入参数,返回的是buffer.toString(encoding)的...

使用Navicat客户端运行SQL语句出现中文乱码

出现乱码无非就是编码方式不统一造成的,通过查阅资料解决了问题。 (简 体中文系统环境支持国标 GB2312、GB18030 和 Unicode (UTF-8) 编码。它们在系统中设置的locale(亦指语言别)名称为:   国标 GB2312: zh_CN.hp15CN   国标 GB18030: zh_CN.gb18030   Unicode (UTF-...

PowerShell或命令行运行javac xx.java提示“编码GBK的不可映射字符”

由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统默认采用的编码格式(GBK),然后JDK就把Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内存中,然后javac把转换后的Unicode格式的文件编译成class类文件。中文不支持Unicode编码,所以报错。 解决办法(两种): javac...