cocos2dx 중국어 UTF 8 코드 전환 솔 루 션
cocos2dx 는 중국어 디 스 플레이 를 지원 합 니 다. 중국어 문 자 를 UTF - 8 문자 집합 으로 변환 하면 정상적으로 표시 할 수 있 지만 실천 적 으로 많은 문제 가 발생 하여 개발 자 를 괴 롭 힐 수 있 습 니 다.
일반적으로 현재 의 해결 방안 은 다음 과 같은 몇 가지 가 있다.
1. 코드 파일 (. h /. cpp /. lua 등) 의 파일 인 코딩 형식 을 UTF - 8 형식 으로 바 꾸 면 됩 니 다. 이것 은 단일 게임 에 있어 서 좋 은 해결 방안 입 니 다.하지만 서버 에서 들 려 오 는 문자 에는 어 쩔 수 없 었 다.
2. iconv 라 이브 러 리 를 사용 하여 변환 합 니 다. 인 터 페 이 스 를 사용 하 는 것 이 간단 합 니 다. win 32 버 전도 직접 사용 할 수 있 지만 안 드 로 이 드 에 서 는 iconv 의 소스 코드 를 직접 컴 파일 하여 통합 시 켜 야 합 니 다. 하지 않 은 것 은 어렵 습 니 다.
3. 자립 갱생, 스스로 코드 를 작성 하여 실현 합 니 다.
본 고 는 주로 세 번 째 방안 을 말 하 는데 두 번 째 방안 도 좋 지만 좀 더 괴 롭 히 면 나중에 시간 이 있 으 면 다시 괴 롭 힐 것 이다.
utf - 8 인 터 페 이 스 를 직접 쓰 려 면 주로 다음 과 같은 몇 가지 문 제 를 고려 해 야 한다.주로 크로스 플랫폼 의 문제 다.
1. win 32 아래 에 서 는 간단 하고 쉽게 실현 할 수 있 습 니 다. win32API 가 관련 인 터 페 이 스 를 제공 해 주 었 기 때 문 입 니 다. (Wide Charto MultiByte / MultiByte ToWide Char 등) 조금 만 처리 하면 됩 니 다.관련 코드 는 다음 과 같 습 니 다.
const char* gb23122utf8(const char* gb2312)
{
int len = MultiByteToWideChar(0, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(0, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(65001, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(65001, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
2. 안 드 로 이 드 플랫폼 에서 조금 만 귀 찮 습 니 다.먼저, c 언어 는 win 32 인터페이스 와 비슷 한 인터페이스 (mbstowcs / wcstombs 등) 가 있 습 니 다. 이 방안 에 따라 setlocale 이라는 인 터 페 이 스 를 사용 해 야 합 니 다. 테스트 를 통 해 이 인 터 페 이 스 는 windows 와 Liux 에서 모두 유효 하고 utf - 8 코드 로 정확하게 전환 할 수 있 으 나 안 드 로 이 드 에 서 는 이 인터페이스 가 유효 하지 않 아 NULL 로 되 돌아 가기 때문에 mbstowcs / wcstombs 를 사용 할 수 없습니다.
나중에 몇 가지 자 료 를 뒤 져 서 icu 라 이브 러 리 를 사용 하기 로 결 정 했 습 니 다. 이 라 이브 러 리 는 대부분의 안 드 로 이 드 기기 에 있 습 니 다. 다만 버 전이 다 르 지만 정확하게 전 환 될 수 있 습 니 다. 잠시 이런 구차 한 방안 을 사용 하 겠 습 니 다. 나중에 높 은 방안 을 사용 하 겠 습 니 다.구체 적 인 코드 는 다음 과 같다.
우선 아이 유 라 이브 러 리 의 인터페이스 함수 주 소 를 찾 아야 합 니 다:
#include <dlfcn.h>
void (*ucnv_convert)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*) = 0;
bool openIcuuc()
{
void* libFile = dlopen("/system/lib/libicuuc.so", RTLD_LAZY);
if (libFile)
{
ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(libFile, "ucnv_convert_3_8");
int index = 0;
char fun_name[64];
while (ucnv_convert == NULL)
{
sprintf(fun_name, "ucnv_convert_4%d", index++);
ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(libFile, fun_name);
if (ucnv_convert)
return true;
if (++index > 11)
break;
}
dlclose(libFile);
}
return false;
}
그 다음으로 변환 함수 코드 는 다음 과 같다.
const char* gb23122utf8(const char * gb2312)
{
if (ucnv_convert == NULL)
{
openIcuuc();
}
if (ucnv_convert)
{
int err_code = 0;
int len = strlen(gb2312);
char* str = new char[len * 2 + 10];
memset(str, 0, len * 2 + 10);
ucnv_convert("utf-8", "gb2312", str, len * 2 + 10, gb2312, len, &err_code);
if (err_code == 0)
{
return str;
}
}
char test[256] = "gb23122utf8 error";
char* str = new char[30];
strcpy(str, test);
return str;
}
자, 이제 큰 성 과 를 거 두 었 습 니 다. 몇 대의 안 드 로 이 드 기기 에서 테스트 를 모두 OK 했 지만 시 뮬 레이 터 에서 실 패 했 습 니 다. 라 이브 러 리 가 부족 한 문제 일 수도 있 습 니 다.
물론 필요 하 다 면 이 인 터 페 이 스 를 lua 에 노출 시 켜 사용 할 수 있다.
static int luaA_Strg2u(lua_State *L)
{
const char* gb2312 = luaL_checkstring(L, 1);
const char* utf8 = gb23122utf8(gb2312);
lua_pushstring(L, utf8);
delete [] utf8;
return 1;
}
void registerLuaFunction(lua_State* luaState)
{
lua_register(luaState, "strg2u", luaA_Strg2u);
tolua_api4lua_open(luaState);
}
마지막 으로 제 가 봉 한 서 류 를 여러분 께 공유 해 드 리 겠 습 니 다!
파일 이름: GB 23122 Utf 8. h
#ifndef __GB23122Utf8_H_
#define __GB23122Utf8_H_
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
const char* gb23122utf8(const char* gb2312)
{
int len = MultiByteToWideChar(0, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(0, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(65001, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(65001, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <dlfcn.h>
void (*ucnv_convert)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*) = 0;
bool openIcuuc()
{
void* libFile = dlopen("/system/lib/libicuuc.so", RTLD_LAZY);
if (libFile)
{
ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(libFile, "ucnv_convert_3_8");
int index = 0;
char fun_name[64];
while (ucnv_convert == NULL)
{
sprintf(fun_name, "ucnv_convert_4%d", index++);
ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(libFile, fun_name);
if (ucnv_convert)
return true;
if (++index > 11)
break;
}
dlclose(libFile);
}
return false;
}
const char* gb23122utf8(const char * gb2312)
{
if (ucnv_convert == NULL)
{
openIcuuc();
}
if (ucnv_convert)
{
int err_code = 0;
int len = strlen(gb2312);
char* str = new char[len * 2 + 10];
memset(str, 0, len * 2 + 10);
ucnv_convert("utf-8", "gb2312", str, len * 2 + 10, gb2312, len, &err_code);
if (err_code == 0)
{
return str;
}
}
char test[256] = "gb23122utf8 error";
char* str = new char[30];
strcpy(str, test);
return str;
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
const char* gb23122utf8(const char * gb2312)
{
return gb2312;
}
#endif
#endif //__GB23122Utf8_H_
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.