C语言:通过串口(TX,RX)发送歌曲名给MCU,歌曲名格式是utf8,中、英文如何解析,以什么格式发给MCU呢?

感谢回答!

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编码 比较容易,网上也有比较多的资料