cocos2d-x 中文輸出 GB2312與UFT8互轉

剛剛入門cocos2d-x的時候,第一個運行的項目就是"hello world",但是想打印出"你好世界"是不是發現輸出的都是亂碼?

原因就是c默認的編碼是GB2312,但是現在我們的程序使用的是UTF8編碼.

現在有兩個辦法解決中文正確輸出的問題:


第一種辦法

點擊你要保存的文件,

點擊文件下的高級保存選項,

將編碼改爲UTF-8帶簽名,就可以了.


下面我們來說第二種辦法

1.在你的cocos2d的目錄下搜索iconv文件夾,這個文件夾中的內容是這樣的


將這個文件夾複製到你的cocos2d的根目錄下.

2.在項目的附加包含目錄中加入$(SolutionDir)iconv\include;(如果是新的生成辦法則加入$(ProjectDir)..\..\..\iconv\include;)

3.在項目的附加依賴項中加入libiconv.lib;

4.貼代碼啦~

.h

#ifndef _CTRANSCODING_H_
#define _CTRANSCODING_H_

#include "iconv.h" 
#include "cocos2d.h"
#include "platform/third_party/win32/iconv/iconv.h"
USING_NS_CC;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) 
#pragma comment(lib,"libiconv.lib") 
#endif   

int UtF_8(char* from_charset, char* to_charset, char* intbuf, size_t inlen, char* outbuf, size_t outlen);

char* a2u(const char* ipt,bool g_u = true);

#endif

.cpp

#include "CTranscoding.h"

int UtF_8(char* from_charset, char* to_charset, char* intbuf, size_t inlen, char* outbuf, size_t outlen)
{
	iconv_t iconvH;
	iconvH = iconv_open(to_charset, from_charset);
	if (!iconvH)
		return 0;
	memset(outbuf, 0, outlen);

#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
	char* temp = intbuf;
	char** pin = &temp;
	char** pout = &outbuf;

	if (!iconv(iconvH, pin, &inlen, pout, &outlen))
	{
		iconv_close(iconvH);
		return 0;
	}
#else
	if (!iconv(iconvH, &intbuf, &inlen, &outbuf, &outlen))
	{
		iconv_close(iconvH);
		return 0;
	}
#endif
	iconv_close(iconvH);
	return 0;
}

char* a2u(const char* ipt,bool g_u)
{
	char buf[1024] = {};
	memcpy(buf,ipt,(int)strlen(ipt));
	memset(my_output,0,1024);
	if(buf[0] == 0)
	{
		my_output[0] = ' ';
		return my_output;
	}
	size_t inlen = strlen(buf);
	size_t outlen = inlen << 1;
	if(g_u)
		UtF_8("gb2312", "utf-8",buf, inlen, my_output, outlen);
	else
		UtF_8("utf-8", "gb2312",buf, inlen, my_output, outlen);
	
	//my_output是一個全局char* 我開了1024,這個可以根據項目對中文需求的長度來設定,因爲重複需求,所以定義全局會比較方便
	return my_output;	
}


貼一個使用方法吧

CCLabelTTF* mylabel = CCLabelTTF::create(a2u("你好世界"), "Arial", 18);	
mylabel->setPosition(ccp(200 , 200));
this->addChild(mylabel);

結束了? NONONO,現在僅僅是在PC上運行OK,現在還無法編譯出 .so文件,所以下面我們要修改Android.mk

直接打開mk修改就好了

添加

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../iconv/include \
   $(LOCAL_PATH)/../../iconv/libcharset \
   $(LOCAL_PATH)/../../iocnv/libcharset/lib \
   $(LOCAL_PATH)/../../iocnv/libcharset/include \
   $(LOCAL_PATH)/../../iconv \
   $(LOCAL_PATH)/../../libiconv/lib \
   $(LOCAL_PATH)/../../libiconv/srclib

LOCAL_WHOLE_STATIC_LIBRARIES := libiconv cocos2dx_static cocosdenshion_static cocos_extension_static

$(call import-module,iconv) \

ok,搞定,到你的手機上運行看看吧!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章