cocos2dx中UTF-8和GBK2312之间的转换
2015-10-07 18:03
501 查看
.cpp中
#ifndef _CHARSET_CONVERT_H_ #define _CHARSET_CONVERT_H_ //starios alter #include <stdlib.h> #include "stddef.h" #include <string> using namespace std; class CharsetConvert { public: static std::string GBKToUTF8(const char* msg); static std::string UTF8ToGBK(const char* msg); static int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen); static int IsTextUTF8(const char* str,int length); }; #endif
.cpp中
#include "CharsetConvert.h" #include <string> #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "external/win32-specific/icon/include/iconv.h" #else #include "iconv/include/iconv.h"" #endif int CharsetConvert::IsTextUTF8(const char* str,int length) { int i; int nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节 char chr; bool bAllAscii=true; //如果全部都是ASCII, 说明不是UTF-8 for(i=0;i<length;i++) { chr= *(str+i); if( (chr&0x80) != 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx bAllAscii= false; if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数 { if(chr>=0x80) { if(chr>=0xFC&&chr<=0xFD) nBytes=6; else if(chr>=0xF8) nBytes=5; else if(chr>=0xF0) nBytes=4; else if(chr>=0xE0) nBytes=3; else if(chr>=0xC0) nBytes=2; else { return false; } nBytes--; } } else //多字节符的非首字节,应为 10xxxxxx { if( (chr&0xC0) != 0x80 ) { return false; } nBytes--; } } if( nBytes > 0 ) //违返规则 { return false; } if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8 { return false; } return true; } int CharsetConvert::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 = iconv_open(to_charset,from_charset); if(cd==0) return -1; if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; iconv_close(cd); return 0; } std::string CharsetConvert::GBKToUTF8(const char *inbuf) { size_t inlen = strlen(inbuf); char * outbuf = new char[inlen * 2 + 2]; std::string strRet; if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0) { strRet = outbuf; } delete [] outbuf; return strRet; } std::string CharsetConvert::UTF8ToGBK(const char *inbuf) { size_t inlen = strlen(inbuf); char * outbuf = new char[inlen * 2 + 2]; std::string strRet; if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0) { strRet = outbuf; } delete [] outbuf; return strRet; }
相关文章推荐
- cocos代码研究(12)UI之Widget学习笔记
- cocos代码研究(11)ActionManager类学习笔记
- cocos代码研究(10)ActionEase子类学习笔记
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--防御塔(二)之初级箭塔
- Cocos2D粒子发射器的纹理
- Cocos2D粒子发射器的纹理
- Cocos2D粒子发射器的纹理
- cocos2dx WindowsError: [Error 5] : 'assets'
- xcode导入Cocos2dx项目的注意事项
- Cocos2dx编译Android问题之Multiple markers at this line
- 什么叫精灵帧动画
- cocos2d-x对Vector<Node*>排序
- 【DrawNode比较先进】cocos2dx3.0 DrawNode的使用
- cocos2d-x开发准备及其环境部署
- cocos代码研究(9)ProgressTimer类学习笔记
- Cocos 3D功能初探学习笔记(3)---光照
- 寒風的Cocos之旅之C++篇REATE_FUNC宏的解析
- MacOSX Cocos2d-x 配置Android Studio以及Xcode开发环境
- cocos2d-js 3.0 beta + cocos code ide + pomelo手游框架搭建
- cocos2d-x 瞬时动作