#if (defined _WIN32 || defined _WIN64)
# include <windows.h>
# include <stdio.h>
# include <ctype.h>
#elif defined(__linux__)
# include <iconv.h>
# include <wctype.h>
# include <wchar.h>
# include <errno.h>
#endif using namespace std; //代码页
#define CP_GBK 936
#define CP_UTF8 65001 std::wstring s2ws(const std::string str, int code_page);
std::string ws2s(const std::wstring wstr, int code_page); //默认的输出字符串字节长度
//经测试发现OUT_LEN = 10 每次可转3个汉字
const int OUT_LEN = ; /** @fn wstring s2ws(const string str, int code_page)
* @brief 从多字节字符串转为宽字符串
* @param str 源字符串
* @param code_page 要使用的代码页
* @return 成功返回宽字符串,失败返回空字符串
*/
wstring s2ws(const string str, int code_page)
{
wstring wstr_dest;
if (str.size() == )
{
return wstr_dest;
}
wchar_t* wcs = NULL;
#ifdef _MSC_VER
//要转换的多字节字符串
int size = MultiByteToWideChar(code_page, , str.c_str(), -, NULL, );
wcs = new(std::nothrow)wchar_t[size];
if (wcs == NULL)
{
return wstr_dest;
}
if (MultiByteToWideChar(code_page, , str.c_str(), -, wcs, size) == )
{
wstr_dest.clear();
}
else
{
wstr_dest += wcs;
}
delete[] wcs; #elif defined __linux
//申请临时缓冲区,用于保存转换后的字符串
wcs = new(std::nothrow)wchar_t[OUT_LEN];
if (wcs == NULL)
{
return wstr_dest;
}
iconv_t handle = (void*)-;
switch (code_page)
{
case CP_GBK:
handle = iconv_open("UCS-4", "GBK");
break;
case CP_UTF8:
handle = iconv_open("UCS-4", "UTF-8");
break;
default:
//不支持
break;
}
if (handle == (void*)-)
{
delete[] wcs;
return wstr_dest;
} size_t nsrc = str.size()*sizeof(char);
char* src = (char*)str.c_str();
wchar_t* tmp = wcs;
size_t ndst = OUT_LEN * sizeof(wchar_t);
//需多次转换,直到转换完毕
while (nsrc>)
{
memset(wcs, , OUT_LEN*sizeof(wchar_t));
tmp = wcs;
ndst = OUT_LEN * sizeof(wchar_t);
if (iconv(handle, (char**)&src, &nsrc, (char**)&tmp, &ndst) ==(size_t)- && errno != E2BIG)
{
wstr_dest.clear();
break;
}
wstr_dest += wstring(wcs, OUT_LEN - ndst/sizeof(wchar_t));
}
iconv_close(handle);
//释放临时缓冲区
delete[] wcs; #endif
return wstr_dest;
} /** @fn string ws2s(const wstring wstr, int code_page)
* @brief 从宽字符串转为多字节字符串
* @param wstr 源字符串
* @param code_page 要使用的代码页
* @return 成功返回多字节字符串,失败返回空字符串
*/
string ws2s(const wstring wstr, int code_page)
{
string str_dest;
if (wstr.size() == )
{
return str_dest;
}
char *mbs = NULL;
#ifdef _MSC_VER
int size = WideCharToMultiByte(code_page, , wstr.c_str(), -, NULL, , NULL, NULL);
mbs = new(std::nothrow) char[size];
if (NULL == mbs)
{
return str_dest;
}
if ( == WideCharToMultiByte(code_page, , wstr.c_str(), -, mbs, size, NULL, NULL))
{
str_dest.clear();
}
else
{
str_dest += mbs;
}
delete[] mbs;
#elif defined __linux
//申请临时缓冲区,用于保存转换后的字符串
mbs = new(std::nothrow)char[OUT_LEN];
if (NULL == mbs)
{
return str_dest;
}
iconv_t handle = (void*)-;
switch (code_page)
{
case CP_GBK:
handle = iconv_open("GBK", "UCS-4");
break;
case CP_UTF8:
handle = iconv_open("UTF-8", "UCS-4");
break;
default:
//不支持
break;
}
if (handle == (void*)-)
{
delete[] mbs;
return str_dest;
} size_t nsrc = wstr.size() * sizeof(wchar_t);
wchar_t* src = (wchar_t*)wstr.c_str();
char* tmp = NULL;
size_t ndst = OUT_LEN;
//需多次转换,直到转换完毕
while (nsrc>)
{
memset(mbs, , OUT_LEN);
tmp = mbs;
ndst = OUT_LEN;
if (iconv(handle, (char**)&src, &nsrc, (char**)&tmp, &ndst) ==(size_t)- && errno != E2BIG)
{
str_dest.clear();
break;
}
str_dest += string(mbs, OUT_LEN - ndst);
}
iconv_close(handle);
//释放临时缓冲区
delete[] mbs; #endif
return str_dest;
} /** @fn string utf82gbk(const string str_utf8)
* @brief 从UTF-8字符串转为GBK字符串
* @param str_utf8 源字符串
* @return 成功返回GBK字符串,失败返回空字符串
*/
string utf82gbk(const string str_utf8)
{
string str_gbk;
#ifdef _MSC_VER
wstring wstr = s2ws(str_utf8, CP_UTF8);
str_gbk = ws2s(wstr, CP_GBK);
#elif defined __linux
//申请临时缓冲区,用于保存转换后的字符串
char* gbk = new(std::nothrow)char[OUT_LEN];
if (NULL == gbk)
{
return str_gbk;
}
iconv_t handle = iconv_open("GBK", "UTF-8");
if (handle == (void*)-)
{
delete[] gbk;
return str_gbk;
}
size_t nsrc = str_utf8.size();
char* src = (char*)str_utf8.c_str();
char* tmp = NULL;
size_t ndst = OUT_LEN;
//需多次转换,直到转换完毕
while (nsrc > )
{
memset(gbk, , OUT_LEN);
tmp = gbk;
ndst = OUT_LEN;
if (iconv(handle, (char**)&src, &nsrc, (char**)&tmp, &ndst) ==(size_t)- && errno != E2BIG)
{
str_gbk.clear();
break;
}
str_gbk += string(gbk, OUT_LEN - ndst);
}
iconv_close(handle);
//释放临时缓冲区
delete[] gbk;
#endif
return str_gbk;
} /** @fn string gbk2utf8(const string str_gbk)
* @brief 从GBK字符串转为UTF-8字符串
* @param str_gbk 源字符串指针
* @return 成功返回UTF-8字符串,失败返回空字符串
*/
string gbk2utf8(const string str_gbk)
{
string str_utf8;
#ifdef _MSC_VER
wstring wstr = s2ws(str_gbk, CP_GBK);
str_utf8 = ws2s(wstr, CP_UTF8);
#elif defined __linux
//申请临时缓冲区,用于保存转换后的字符串
char* utf8 = new(std::nothrow)char[OUT_LEN];
if (NULL == utf8)
{
return str_utf8;
}
iconv_t handle = iconv_open("UTF-8", "GBK");
if (handle == (void*)-)
{
delete[] utf8;
return str_utf8;
}
size_t nsrc = str_gbk.size();
char* src = (char*)str_gbk.c_str();
char* tmp = NULL;
size_t ndst = OUT_LEN;
//需多次转换,直到转换完毕
while (nsrc > )
{
memset(utf8, , OUT_LEN);
tmp = utf8;
ndst = OUT_LEN;
if (iconv(handle, (char**)&src, &nsrc, (char**)&tmp, &ndst) ==(size_t)- && errno != E2BIG)
{
str_utf8.clear();
break;
}
str_utf8 += string(utf8, OUT_LEN - ndst);
}
iconv_close(handle);
//释放临时缓冲区
delete[] utf8;
#endif
return str_utf8;
} //wchar_t转成UTF-8
int Wchar2Utf8Convert( const wchar_t* a_szSrc, char* a_szDest, int a_nDestSize )
{
#if (defined _WIN32 || defined _WIN64)
return WideCharToMultiByte( CP_UTF8, , a_szSrc, -, a_szDest, a_nDestSize, NULL, NULL );
#elif defined(__linux__)
size_t result;
size_t srcSize = (wcslen(a_szSrc)+)*sizeof(wchar_t);
iconv_t env;
env = iconv_open("UTF-8","WCHAR_T");
if (env==(iconv_t)-)
{
//printf("iconv_open WCHAR_T->UTF8 error%s %d/n",strerror(errno),errno) ;
return ;
}
size_t buf_count = a_nDestSize;
result = iconv(env,(char**)&a_szSrc,(size_t*)&srcSize,(char**)&a_szDest,(size_t*)&buf_count);
if (result==(size_t)-)
{
//printf("iconv WCHAR_T->UTF8 error %d/n",errno) ;
return ;
}
iconv_close(env);
return (int)result;
#endif
} //UTF-8转成wchar_t
int Utf82WcharConvert( const char* a_szSrc, wchar_t* a_szDest, int a_nDestSize )
{
#if (defined _WIN32 || defined _WIN64)
return MultiByteToWideChar( CP_UTF8, , a_szSrc, -, a_szDest, a_nDestSize );
#elif defined(__linux__)
size_t result;
iconv_t env;
size_t size = strlen(a_szSrc)+ ;
env = iconv_open("WCHAR_T","UTF-8");
if (env==(iconv_t)-)
{
//printf("iconv_open UTF8->WCHAR_T error %d/n",errno) ;
return ;
}
size_t buf_count = a_nDestSize*sizeof(wchar_t);
result = iconv(env,(char**)&a_szSrc,(size_t*)&size,(char**)&a_szDest,(size_t*)&buf_count);
if (result==(size_t)-)
{
//printf("iconv UTF8->WCHAR_T error %d/n",errno) ;
return ;
}
iconv_close(env);
return (int)result; #endif
}

跨平台字符编码转换GBK、UTF8的更多相关文章

  1. 字符编码-UNICODE,GBK,UTF-8区别【转转】

    字符编码介绍及不同编码区别 今天看到这篇关于字符编码的文章,抑制不住喜悦(总结的好详细)所以转到这里来.转自:祥龙之子http://www.cnblogs.com/cy163/archive/2007 ...

  2. SAP系统跨平台字符编码转换

    SAP系统在进行了夸平台的迁移,可能会遇到操作系统层文件编码不同,导致SAP系统无法识别或者乱码的问题.例如SAP系统从AIX平台迁移到linux平台,SAP应用服务器的编码会发生变化,从4102变化 ...

  3. php字符编码转换之gb2312转为utf8(转)

    在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...

  4. 字符编码之间的相互转换 UTF8与GBK(转载)

    转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...

  5. Linux字符编码默认为UTF-8,如出现乱码可设置为GBK

    Linux字符编码默认为UTF-8,如出现乱码可设置为GBK1.手动更改profile文件的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 文件,如 LAN ...

  6. iconv字符编码转换

    转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...

  7. php 字符编码转换函数 iconv mb_convert_encoding比较

    在使用PHP处理字符串时,我们经常会碰到字符编码转换的问题,你碰到过iconv转换失败吗? 发现问题时,网上搜了搜,才发现iconv原来有bug ,碰到一些生僻字就会无法转换,当然了配置第二个参数时, ...

  8. 编码问题 php字符编码转换类

    各种平台和软件打开显示的编码问题,需要使用不同的编码,根据我们不同的需求. php 字符编码转换类,支持ANSI.Unicode.Unicode big endian.UTF-8.UTF-8+Bom ...

  9. Python—字符编码转换、函数基本操作

    字符编码转换 函数 #声明文件编码,格式如下: #-*- coding:utf-8 -*- 注意此处只是声明了文件编码格式,python的默认编码还是unicode 字符编码转换: import sy ...

随机推荐

  1. 关于ArcGis for javascrept查询ArcGis server图层信息的方式

    方式一: queryTask方式: 该方式用于单个图层的条件查询(不能跨图层查询) 1. 创建query对象 query = new esri.tasks.Query(); 2. 给query对象设置 ...

  2. UVa 1363 Joseph's Problem (数论)

    题意:给定 n,k,求 while(i <=n) k % i的和. 析:很明显是一个数论题,写几个样例你会发现规律,假设 p = k / i.那么k  mod i = k - p*i,如果 k ...

  3. 洛谷 P1081 开车旅行【双向链表+倍增】

    倍增数组的20和N写反了反复WAWAWA-- 注意到a和b在每个点上出发都会到一个指定的点,所以这样构成了两棵以n点为根的树 假设我们建出了这两棵树,对于第一问就可以枚举起点然后倍增的找出ab路径长度 ...

  4. Docker的基础知识与安装(Ubantu CentOS)

    Docker是一种允许特殊类型虚拟化的实用程序.Docker允许使用Docker镜像在系统上“虚拟”运行程序.可以下载或创建可以运行的图像.一旦加载并执行了图像,它现在就是一个容器.容器已为容器内的程 ...

  5. ntp多台主机时间同步

    通俗的讲,多台主机ntp时间同步,就是自定义集群中一台机器(我们这里叫它server)与网络时间同步,然后其它主机与server主机时间同步 另外,ntp时间同步机制不是我们想象的那样直接同步,而是“ ...

  6. python之排序算法-冒泡、选排、快排

    影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效率的排序算法应该是具有尽可能少的关键字比较次数和记录的移动次数 空间复杂度:主要是执行算法所需要的辅助空间,越少越好. 算法复杂性.主要是指 ...

  7. Poj 2289 Jamie's Contact Groups (二分+二分图多重匹配)

    题目链接: Poj 2289 Jamie's Contact Groups 题目描述: 给出n个人的名单和每个人可以被分到的组,问将n个人分到m个组内,并且人数最多的组人数要尽量少,问人数最多的组有多 ...

  8. ssrs 2016, mobile report error: The report may be misconfigured, the data may not be available, or the server version may be unsupported.

    使用多账户配置ssrs mobile report 权限后,使用客户端显示: 使用web 查阅,显示: 遇到这种情况,可能是由于,report引用了 数据集文件夹中的数据集,请记得把数据集文件夹上为该 ...

  9. C# 基础知识和VS2010的小技巧总汇(2)[转]

    1.使用关键字readonly ,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化语句赋值 2..net4.0新增一个  Tuple 类,代表一个有序的N元组.可以调用Tuple.Create ...

  10. vue watch监听对象及对应值的变化

    data:{ a:1, b:{ value:1, type:1, } }, watch:{ a(val, oldVal){//普通的watch监听 console.log("a: " ...