gbk与utf-8转换

linux:

 1 #include <iconv.h>
 2
 3 int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
 4 {
 5         iconv_t cd;
 6         int rc;
 7         char **pin = &inbuf;
 8         char **pout = &outbuf;
 9
10         cd = iconv_open(to_charset,from_charset);
11         if (cd==0)
12                 return -1;
13         memset(outbuf,0,outlen);
14         if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
15                 return -1;
16         iconv_close(cd);
17         return 0;
18 }
19
20 int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
21 {
22         return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
23 }
24
25 int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
26 {
27         return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
28 }

解释:

其中

iconv函数族的头文件是iconv.h,使用前需包含之。
#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。

Windows:

 1     #include <iostream>
 2     #include <string>
 3     #include <fstream>
 4     #include <windows.h>
 5
 6     using namespace std;
 7
 8     string GBKToUTF8(const std::string& strGBK)
 9     {
10         string strOutUTF8 = "";
11         WCHAR * str1;
12         int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
13         str1 = new WCHAR[n];
14         MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
15         n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
16         char * str2 = new char[n];
17         WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
18         strOutUTF8 = str2;
19         delete[]str1;
20         str1 = NULL;
21         delete[]str2;
22         str2 = NULL;
23         return strOutUTF8;
24     }
25
26     string UTF8ToGBK(const std::string& strUTF8)
27     {
28         int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
29         unsigned short * wszGBK = new unsigned short[len + 1];
30         memset(wszGBK, 0, len * 2 + 2);
31         MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8.c_str(), -1, wszGBK, len);
32
33         len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
34         char *szGBK = new char[len + 1];
35         memset(szGBK, 0, len + 1);
36         WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGBK, len, NULL, NULL);
37         //strUTF8 = szGBK;
38         std::string strTemp(szGBK);
39         delete[]szGBK;
40         delete[]wszGBK;
41         return strTemp;
42     }
43
44     int _tmain(int argc, _TCHAR* argv[])
45     {
46         string test("我们中国是个强大的名族,强大的动力来自每个人的支持");
47         fstream output("test.txt",ios_base::out | ios_base::app);
48         output << GBKToUTF8(test);
49         //system("iconv -f GBK -t utf-8");
50         return 0;
51     }  
时间: 2024-12-17 22:53:43

gbk与utf-8转换的相关文章

c++字符串编码GBK到UTF8的转换

使用c++跨windows和linux平台实现字符串GBK到UTF8的转换. 原理是GBK字符串先转为unicode编码,然后再转换为UTF8编码. 代码如下: #ifndef __CODE_CONVERT_H__ #define __CODE_CONVERT_H__ #include <cstdio> #include <stdlib.h> #include <locale.h> #include <string> #if defined(_WIN32)

Cocos2dx学习: GBK 和 UTF-8的转换

int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen) { iconv_t cd; const char *temp = inbuf; const char **pin = &temp; char **pout = &outbuf; memset(outbuf, 0, outlen); cd

mysql表utf8编码,内容gbk编码的乱码转换

今天遇到一个数据库库是utf8,表也是utf8,但内容是gbk的问题,出现了中文乱码 第一步  先把所有的表copy一份,比如表名叫 user,copy一份光表结构的,叫user2: 第二步  把表中的数据转码后插入表2的表中 <?php header("Content-type: text/html; charset=utf-8"); function get_sql($tablename){ $con = mysql_connect("localhost"

sublime text 2 技巧

1. 文件快速导航: 这是sublime上面很好用的功能之一,ctrl+p可以调出窗口,菜单上的解释是gotoanythings ,确实如其所言,调出窗口后,直接输入关键字,可以在已打开的项目文件夹中进行快速文件名导航,而且支持模糊搜索,对于不想一直鼠标点开文件夹的同学来说 极为方便,并且在该窗口里加上:前缀即为行跳转(ctrl+G),加上@(ctrl+R)前缀在html里是id 关键字导航,css里是每条规则导航,js里则是每个function导航. 2. 命令行模式 ctrl+` 可以调出命

Sublime Text安装和使用

Sublime text插件功能很强大,必须要安装 1.直接安装 安装Sublime text 2插件很方便,可以直接下载安装包解压缩到Packages目录(菜单->preferences->packages). 2.使用Package Control组件安装 也可以安装package control组件,然后直接在线安装: 按Ctrl+`调出console(注:安装有QQ输入法的这个快捷键会有冲突的,输入法属性设置-输入法管理-取消热键切换至QQ拼音) 粘贴以下代码到底部命令行并回车:imp

FATFS外置UNICODE GBK双向转换码表(转)

源:FATFS外置UNICODE GBK双向转换码表 将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持, 首先将UtoG.sys,GtoU.sys两个文件放到SD卡根目录,注意,一定要在根目录,并且是短文件名,因为长文件名需要UNICODE支持,此时的FATFS还是不支持长文件名的,但是当初始化UNICODE码表后就可以支持长文件名了. 两个码表下载地址:http://download.csdn.net/detail/cp1300/552673

多线程批量转换文件编码, 从GBK, GB2312编码转换到UTF-8编码(Python)

# coding=utf-8 # author:Jeffrey Ma # version:0.1 # build 2 # created on:2015年3月31日 # description: 1. 批量转换文件编码,从GBK GB2312编码转换到UTF-8编码 # 2. 支持指定目录下所有的文件的转换,包括子目录中的文件 # 3. 支持检测原始编码,对已经是UTF-8编码的文件,不做转换 # 4. 支持只转换指定扩展名的编码 # 5. 支持多线程转换和控制台输出 # 6. 支持控制台显示线

JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

关于解决乱码问题的一点探索之二(涉及Unicode(utf-16)和GBK)

    在上篇日志中(链接),我们讨论了utf-8编码和GBK编码之间转化的乱码问题,这一篇我们讨论Unicode(utf-16编码方式)与GBK编码之间转换的乱码问题.     在Windows系统自带的记事本中,我们按照图中所示使用Unicode编码保存.     在Visual Studio 2005中,单击"文件|高级保存选项"中选择Unicode-代码页1200. 文件中只有乱码与ASCII码     按照上一篇日志中的方法,我们使用WinHex软件查看文件的16进制数据,如

Discuz从GBK转码UTF-8的最佳方法

最近由于论坛帐号整合需要,不得不把原蓝卡论坛的GBK编码转换为UTF-8,由于Discuz官方并没有提供转换工具,网上也没有什么靠谱的教程,而且论坛中数据较多,可闪失不得,这不禁让我十分为难.. 我先尝试了网上比较流行的一种利用Discuz数据库功能进行数据库备份.恢复达到转换目的的方法,可是在我按照教程进行操作后,发现虽然前台的帖子.用户等数据全部恢复,但是后台的数据全部丢失!且还有部分乱码的情况出现,要重新设置那么多后台选项,我才不干呢!于是,我便开始琢磨另一种转换方法,当我看到另一篇教程,