感谢回答!
MCU要求以下面的格式发:
比如歌曲名是CD1,那发送0x43 0x44 0x31。
那就是要以ASCII 十六进制发给MCU吧?
//底层只给了以下结构体,char *name 是歌曲名
typedef struct GetFileNameEvtTag {
....
char *name; //USB 歌曲名(utf8 格式)
int num; //曲目号
} GetFileNameEvt;
//调用
GetFileNameEvt *pe = (GetFileNameEvt *)e;
UINT16 name_len = strlen(pe->name);
printf(" song name %s,len %d\n",pe->name,name_len);
//U盘里面的歌曲名是“CD1.mp3”,这里打印pe->name 也是"CD1.mp3",说明这样调用是对的。
把歌曲名改为CD1我.mp3,打印pe->name出来是"CD1鎴mp3",有中文时打印出来就不正确。
问题:
1.歌曲名有中、英文,怎么打印才能正常?
2.歌曲名有中、英文,怎么以ASCII 十六进制发给MCU?或者以怎么格式发给MCU(MCU收到后又怎么解析)。
一. 首先你的歌曲名是从哪获取的,如果是从MP3 Tag中读取的,应该会读取到编码。GB18030,UTF8?等等
二. CD1.mp3是正常的,然后“CD1我.mp3”就异常了。可能是你输出语句不支持uft编码,或者你的串口工具不支持,可以使用“teraterm-4.97.exe”工具试试。
三. 建议将“CD1我.mp3”使用%x方式输出,看看,反推一下。
问题一:请参考上述2。
问题二:如果有中文,就不可能使用ascii,毕竟ascii只有256个,不包括中文。
想要发送中文给MCU,就要约定中文编码,比如uft8,或者gb2312。
CD1我.mp3 的 uft8编码 43.44.31.E6.88.91.2E.6D.70.33
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct GetFileNameEvtTag {
char *name; //USB 歌曲名(utf8 格式)
int num; //曲目号
} GetFileNameEvt;
char *DeleteUTF8(const char *name)
{
char *tempName = NULL;
unsigned int Trgloop = 0;
if(NULL != name)
{
tempName = (char *)malloc(strlen(name));
printf(" DeleteUTF8 name [%s] len [%d] \n",name,strlen(name));
if(NULL != tempName)
{
while((*name) != 0x00)
{
if(((*name) < 128) && ((*name) > 0))
{
printf(" %x \n",(*name));
memcpy(tempName+Trgloop,name,0x01);
Trgloop++;
}
name++;
}
memset(tempName+Trgloop,0x00,0x01);
}
}
return tempName;
}
int main (void)
{
char *TrgName = NULL;
//test code start
GetFileNameEvt pe;
char testname[50] = "cd你ccc我.mp3";
pe.name = (char *)malloc(50);
memset(pe.name,0x00,50);
memcpy(pe.name,testname,strlen(testname));
//test code end
TrgName = DeleteUTF8(pe.name);
char name_len = (char)strlen(TrgName);
printf(" song name [%s] len [%d] \n",TrgName,name_len);
return 0;
}
1、首先要一下中文的编码规则,utf-8、Unicode、gbk 等
2、我们常用的调试助手不支持utf-8编码的中文输出,
问题一、直接打印输出utf-8编码的,是不会正常显示的,调试助手不支持编码。可以输出十六进制,然后找“中英文字符编码查询_V1.1”工具 反推数据是否正常
(改工具正点原子给的资料里面有)
问题二、可以直接用十六进制发送给MCU,然后MCU做转编码解析。这就看你是用哪种方式、字库显示了
如果是用自己做字库显示,建议做Unicode中文字库,
因为utf-8编码 转Unicode编码 比较容易,网上也有比较多的资料