• cocos2d-x:读取指定文件夹下的文件名称+解决中文乱码(win32下有效)


    援引:http://blog.csdn.net/zhanghefu/article/details/21284323

          http://blog.csdn.net/cxf7394373/article/details/7195661



    先看一下用法:

    别忘了引入头文件。   这里我是得到 UserDatas 文件夹下的全部 .json 文件的名字 并转成UTF-8

    #include "MyFileUtils.h"
    #include "IconvString.h"
    
    MyFileUtils fileUtil=MyFileUtils();
    vector<string> fileNames= fileUtil.getUserDataFilesName();	
    vector<string> fileNamesConverted;
     for (int j=0;j<fileNames.size();j++){ 
      fileNamesConverted.push_back(      gb2utf(  fileNames[j].c_str()  )     );
     }


    MyFileUtils.h 文件,直接在.h文件里实现  功能:读取指定文件夹下的文件名称。

    #ifndef __MYFILEUTILS_H__
    #define __MYFILEUTILS_H__
    #include "cocos2d.h"
    #include "io.h"
    #include "iostream"
    #include "vector"
    USING_NS_CC;
    using namespace std;
    class MyFileUtils
    {
    public:
    
    vector<string> getUserDataFilesName(){//我自己的封装
    
    	string str=CCFileUtils::sharedFileUtils()->fullPathForFilename("UserDatas");
    	getJsonFilesName(str.c_str(),files);
    
    	return files;
    
    }
    void getFiles( string path, vector<string>& files ) //通用代码
    {
    	//文件句柄
    	long   hFile   =   0;
    	//文件信息
    	struct _finddata_t fileinfo;
    	string p;
    	if((hFile = _findfirst(p.assign(path).append("\*").c_str(),&fileinfo)) !=  -1)
    	{
    		do
    		{
    			//假设是文件夹,迭代之
    			//假设不是,增加列表
    			if((fileinfo.attrib &  _A_SUBDIR))
    			{
    				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)
    					getFiles( p.assign(path).append("\").append(fileinfo.name), files );
    			}
    			else
    			{
    				files.push_back(p.assign(path).append("\").append(fileinfo.name) );
    			}
    		}while(_findnext(hFile, &fileinfo)  == 0);
    		_findclose(hFile);
    	}
    }
    
    void getJsonFilesName( string path, vector<string>& files )//我自己的封装
    {
    	long   hFile   =   0;
    	struct _finddata_t fileinfo;
    	string p;
    	if((hFile = _findfirst(p.assign(path).append("\*").c_str(),&fileinfo)) !=  -1)
    	{
    		do
    		{			
    			string str=fileinfo.name;
    			if (str.find(".json")!=-1)
    			{
    				files.push_back( fileinfo.name ) ;
    			}
    
    		}while(_findnext(hFile, &fileinfo)  == 0);
    		_findclose(hFile);
    	}
    }
    
    protected:
    
    private:
    	vector<string> files;
    	
    
    };
    #endif




    IconvString.h 转码工具类   功能:转码,解决中文乱码。使用iconv 库
    注意头文件的引入,每一个人可能不一样

    #ifndef ICONV_STRING_H
    #define ICONV_STRING_H
    #include <string>
    #include "iconv/iconv.h"
    //通用代码
    int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen);
    
    std::string utf2gb(const char *inbuf);
    std::string gb2utf(const char *inbuf);
    
    #endif
    </pre><pre code_snippet_id="316364" snippet_file_name="blog_20140428_6_4985379" name="code" class="cpp">//IconvString.cpp 实现
    #include "IconvString.h"
    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 = 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;
    }
    
    /*UTF8转为GB2312*/
    std::string utf2gb(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;
    }
    
    /*GB2312转为UTF8*/
    std::string gb2utf(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;
    }



  • 相关阅读:
    Map根据key或者value排序
    docker部署Javaweb项目(jdk+tomcat+mysql)
    MySQL设置某一字段默认为0,但是插入数据化却显示为null
    文件下载
    JXLS导出Excel(模板导出)
    eclipse使用lombok
    Integer 类型数值判断相等的坑
    通用Mapper相关
    SSM配置Socket多线程编程(RFID签到实例)
    使用JSONObject遇到的问题,java.lang.NoClassDefFoundError: net/sf/json/JSONObject
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6952145.html
Copyright © 2020-2023  润新知