Skip to content

Commit 906d351

Browse files
committed
增加编码检测,支持中文GBK编码和日文ShiftJIS编码的支持
1 parent 5760d4e commit 906d351

File tree

6 files changed

+231
-20
lines changed

6 files changed

+231
-20
lines changed

apps/player/Android.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ LOCAL_SRC_FILES += InterfaceID3.cpp
7272
LOCAL_SRC_FILES += OggID3.cpp
7373
LOCAL_SRC_FILES += AudioId3.cpp
7474
LOCAL_SRC_FILES += base64.cpp
75+
LOCAL_SRC_FILES += Uvcontert.cpp
7576

7677
LOCAL_CPPFLAGS:=\
7778
-I $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics\

apps/player/Uvcontert.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
2+
#include "player.h"
3+
namespace mango
4+
{
5+
uint32_t Uvcontert::getpossibleEncodings(const char *entry){
6+
uint8_t* src = (uint8_t *)entry;
7+
uint8_t uch;
8+
uint32_t tmpEncoding,encoding=0;
9+
bool noAsci = false;
10+
int ret = 0;
11+
12+
if(!entry)
13+
return 0;
14+
15+
while ((uch = *src++)) {
16+
if (uch & 0x80){
17+
noAsci = true;
18+
break;
19+
}
20+
}
21+
22+
if(noAsci){
23+
if(possibleEncodings&&ponvertValues){
24+
tmpEncoding = possibleEncodings(entry);
25+
if(tmpEncoding != kEncodingAll && tmpEncoding != kEncodingNone){
26+
encoding = tmpEncoding;
27+
}
28+
}else
29+
log_i("-----possibleEncodings is null");
30+
}else
31+
encoding = kEncodingAll;
32+
33+
return encoding;
34+
}
35+
36+
Uvcontert::Uvcontert(){
37+
encode = kEncodingAll;
38+
}
39+
40+
Uvcontert::~Uvcontert(){
41+
encode = 0;
42+
}
43+
void Uvcontert::addItem(const char * str){
44+
uint32_t tmp = getpossibleEncodings(str);
45+
entry.addString(str);
46+
encode = encode & tmp;
47+
log_i("tmp=0x%x,encode=0x%x",tmp,encode);
48+
}
49+
void Uvcontert::doContert(){
50+
uint32_t locale;
51+
int i;
52+
if(gSessionLocal.getLangId() == LANGID_SIMPLIFIED ||
53+
gSessionLocal.getLangId() == LANGID_TRADITIONAL){
54+
locale = kEncodingGBK;
55+
}else{
56+
locale = kEncodingShiftJIS;
57+
}
58+
for(i=0;i<entry.getCount();i++){
59+
char out[1024];
60+
CString item;
61+
62+
entry.getCString(i,item);
63+
64+
if(encode != kEncodingAll && encode != kEncodingNone){
65+
if(encode & locale){
66+
ponvertValues(locale,item.string,out);
67+
}else if(encode & kEncodingShiftJIS){
68+
ponvertValues(kEncodingShiftJIS,item.string,out);
69+
}else if(encode & kEncodingGBK){
70+
ponvertValues(kEncodingGBK,item.string,out);
71+
}else{
72+
strcpy(out,item.string);
73+
}
74+
}else{
75+
strcpy(out,item.string);
76+
}
77+
78+
result.addString(out);
79+
}
80+
81+
}
82+
int Uvcontert::getItem(int pos,CString& str){
83+
return result.getCString(pos,str);
84+
}
85+
86+
};
87+
88+

apps/player/Uvcontert.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
namespace mango
3+
{
4+
5+
class Uvcontert{
6+
public:
7+
Uvcontert();
8+
~Uvcontert();
9+
void addItem(const char* str);
10+
void doContert();
11+
int getItem(int pos,CString& str);
12+
uint32_t getpossibleEncodings(const char *entry);
13+
private:
14+
CStringArray entry;
15+
CStringArray result;
16+
uint32_t encode;
17+
};
18+
19+
};

apps/player/mediaprovider.cpp

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,51 @@
66
namespace mango
77
{
88
unsigned long t0=0,t1=0,t2=0;
9+
10+
int uvcontertUtf8(const char *entry,char * out){
11+
uint8_t* src = (uint8_t *)entry;
12+
uint8_t uch;
13+
uint32_t tmpEncoding,encoding;
14+
bool noAsci = false;
15+
int ret = 0;
16+
17+
if(!entry)
18+
return 0;
19+
20+
while ((uch = *src++)) {
21+
if (uch & 0x80){
22+
noAsci = true;
23+
break;
24+
}
25+
}
26+
log_i("noAsci=%d",noAsci);
27+
if(noAsci){
28+
if(possibleEncodings&&ponvertValues){
29+
tmpEncoding = possibleEncodings(entry);
30+
log_i("tmpEncoding=0x%x",tmpEncoding);
31+
encoding = tmpEncoding;
32+
if(encoding != kEncodingAll && encoding != kEncodingNone)
33+
{
34+
// if the locale encoding matches, then assume we have a native encoding.
35+
if (encoding & mLocaleEncoding)
36+
ponvertValues(mLocaleEncoding,entry,out);
37+
else if(encoding & kEncodingEUCKR)
38+
ponvertValues(kEncodingEUCKR,entry,out);
39+
else if(encoding & kEncodingGBK)
40+
ponvertValues(kEncodingGBK,entry,out);
41+
else if(encoding & kEncodingBig5)
42+
ponvertValues(kEncodingBig5,entry,out);
43+
else if(encoding & kEncodingShiftJIS)
44+
ponvertValues(kEncodingShiftJIS,entry,out);
45+
else
46+
return 0;
47+
ret = 1;
48+
}
49+
}
50+
}
51+
return ret;
52+
}
53+
954

1055
static void strlwr(char *string);
1156
static char * getfiletype(char *file);
@@ -534,6 +579,7 @@ namespace mango
534579
existSDcard = 1;
535580
}else{
536581
analyzeAudioID3(curItem,fileArray.mList[i]);
582+
log_i("--->analyzeAudioID3 out");
537583
}
538584
if(sdcard.isSdcard){
539585
sdcard.checkAlbumImage(curItem);
@@ -617,6 +663,8 @@ namespace mango
617663
int len = 1024;
618664
char sqlStr[1024]={0},filename[1024]={0};
619665
CString md5;
666+
Uvcontert mUvcontert;
667+
CString contertOut;
620668

621669
item.clearAll();
622670

@@ -637,17 +685,6 @@ namespace mango
637685

638686
strlwr(filename,sqlStr);
639687
item.addItem("name_key",sqlStr);
640-
641-
memset(value, 0, len);
642-
if (m_id3.GetTags(METADATA_KEY_TITLE, value)){
643-
slqCheck(value);
644-
}else{
645-
getFileTitle(filename,value);
646-
}
647-
item.addItem("title",value);
648-
649-
strlwr(value,sqlStr);
650-
item.addItem("title_key",sqlStr);
651688

652689
item.addItem("inPlay",0);
653690

@@ -658,29 +695,51 @@ namespace mango
658695
item.addItem("track",1000);
659696
}
660697

698+
/*********************************Uvcontert********************************/
699+
#if 1
700+
memset(value, 0, len);
701+
if (m_id3.GetTags(METADATA_KEY_TITLE, value)){
702+
}else{
703+
getFileTitle(filename,value);
704+
}
705+
slqCheck(value);
706+
mUvcontert.addItem(value);
707+
661708
memset(value, 0, len);
662709
if (m_id3.GetTags(METADATA_KEY_ALBUM, value)){
663-
664710
}else{
665711
getFileParentName(info.path.string,value);
666712
}
667713
slqCheck(value);
668-
item.addItem("album",value);
669-
670-
strlwr(value,sqlStr);
671-
item.addItem("album_key",sqlStr);
714+
mUvcontert.addItem(value);
672715

673716
memset(value, 0, len);
674717
if (m_id3.GetTags(METADATA_KEY_ARTIST, value)){
675718
}else{
676719
sprintf(value,"(null)");
677720
}
678721
slqCheck(value);
679-
item.addItem("artist",value);
722+
mUvcontert.addItem(value);
680723

681-
strlwr(value,sqlStr);
682-
item.addItem("artist_key",sqlStr);
724+
mUvcontert.doContert();
683725

726+
mUvcontert.getItem(0,contertOut);
727+
item.addItem("title",contertOut.string);
728+
strlwr(contertOut.string,sqlStr);
729+
item.addItem("title_key",sqlStr);
730+
731+
mUvcontert.getItem(1,contertOut);
732+
item.addItem("album",contertOut.string);
733+
strlwr(contertOut.string,sqlStr);
734+
item.addItem("album_key",sqlStr);
735+
736+
mUvcontert.getItem(2,contertOut);
737+
item.addItem("artist",contertOut.string);
738+
strlwr(contertOut.string,sqlStr);
739+
item.addItem("artist_key",sqlStr);
740+
#endif
741+
/*************************Uvcontert UFT-8***************************************/
742+
684743
memset(value, 0, len);
685744
if (m_id3.GetTags(METADATA_KEY_GENRE, value)){
686745
}else{
@@ -737,7 +796,7 @@ namespace mango
737796
}else{
738797
item.addItem("img_path","(null)");
739798
}
740-
799+
log_i("------>end");
741800
free(value);
742801
value = NULL;
743802
}

apps/player/player.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,9 @@ namespace mango
796796

797797
Player gPlayer;
798798
MSkBitmap gWallpaperBitmap;
799+
uint32_t (*possibleEncodings)(const char*) = NULL;
800+
void (*ponvertValues)(uint32_t,const char*,char*) = NULL;
801+
uint32_t mLocaleEncoding = kEncodingGBK;
799802
};
800803

801804

@@ -805,5 +808,28 @@ int main (int argc, char* argv[])
805808
#ifndef WIN32
806809
//mango::Thread::sleep(1000 * 3);
807810
#endif
811+
#ifdef CONVERT_UTF8
812+
log_i("------dlopen (/system/lib/libmedia.so)------");
813+
void * filehandle = dlopen("/system/lib/libmedia.so", RTLD_NOW);
814+
815+
if(filehandle){
816+
mango::possibleEncodings = (uint32_t (*)(const char*))dlsym(filehandle, "_ZN7android6mytestEPKc");
817+
mango::ponvertValues = (void (*)(uint32_t,const char*,char*))dlsym(filehandle, "_ZN7android5myponEjPKcPc");
818+
if(mango::possibleEncodings){
819+
log_i("---------->get method possibleEncodings success");
820+
}else{
821+
log_i("---------->get possibleEncodings fail:%s",dlerror());
822+
}
823+
824+
if(mango::ponvertValues){
825+
log_i("---------->get method ponvertValues success");
826+
}else{
827+
log_i("---------->get ponvertValues fail:%s",dlerror());
828+
}
829+
}else{
830+
log_i("dlopen (/system/lib/libmedia.so) fail!");
831+
}
832+
#endif
833+
808834
return mango::gPlayer.main();
809835
}

apps/player/player.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,28 @@
3939
#include "OggID3.h"
4040
#include "DsfID3.h"
4141
#include "AudioId3.h"
42+
#include <dlfcn.h>
43+
#include "Uvcontert.h"
4244

4345

4446
#define ARRAY_LIST_NUM 100
47+
#define CONVERT_UTF8
4548

4649
namespace mango
4750
{
4851
//#define NEED_SLEEP
52+
enum {
53+
kEncodingNone = 0,
54+
kEncodingShiftJIS = (1 << 0),
55+
kEncodingGBK = (1 << 1),
56+
kEncodingBig5 = (1 << 2),
57+
kEncodingEUCKR = (1 << 3),
58+
kEncodingUTF8 = (1<<4),
59+
kEncodingWin1251 = (1<<5),
60+
kEncodingWin1252 = (1<<6),
61+
kEncodingAll = (kEncodingShiftJIS | kEncodingGBK | kEncodingBig5 | kEncodingEUCKR|kEncodingUTF8|kEncodingWin1251|kEncodingWin1252),
62+
};
63+
4964

5065
enum{
5166
IOCTRL_BRIGTNESS_READ=0,
@@ -248,4 +263,7 @@ namespace mango
248263

249264
extern Player gPlayer;
250265
extern MSkBitmap gWallpaperBitmap;
266+
extern uint32_t (*possibleEncodings)(const char*);
267+
extern void (*ponvertValues)(uint32_t,const char*,char*);
268+
extern uint32_t mLocaleEncoding;
251269
};

0 commit comments

Comments
 (0)