具体实现看H7-TOOL的APP代码里面的bsp_user_lib.C文件即可:
调用方法,在工程里面检索:StrUTF8ToGBK
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
/*
*********************************************************************************************************
* 函 数 名: StrUTF8ToGBK
* 功能说明: 将UTF8字符串转换GBK字符串
* 形 参: utf8 输入字符串
* gbk 输出字符串
* gbk_size 字符串size
* 返 回 值: 字符串
*********************************************************************************************************
*/
char *StrUTF8ToGBK(char *utf8, char *gbk, uint16_t gbk_size)
{
uint8_t code1, code2;
char *_ptr;
char *_pOut;
uint16_t len = 0;
_ptr = utf8;
_pOut = gbk;
/* 开始循环处理字符 */
while (*_ptr != 0)
{
code1 = *_ptr; /* 读取字符串数据, 该数据可能是ascii代码,也可能汉字代码的高字节 */
if (code1 < 0x80)
{
if (len + 1 < gbk_size)
{
*_pOut++ = code1;
len++;
}
}
else
{
/* 解读 UTF-8 编码非常简单。
如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
UNICODE 最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0
110XXXXX 10XXXXXX -- 支持
1110XXXX 10XXXXXX 10XXXXXX -- 支持
11110XXX 10XXXXXX 10XXXXXX 10XXXXXX -- 本转换程序不支持
*/
{
uint8_t code3;
uint32_t unicode1;
uint16_t gb;
if ((code1 & 0xE0) == 0xC0) /* 2字节 */
{
code2 = *++_ptr;
if (code2 == 0)
{
break;
}
unicode1 = ((uint32_t)(code1 & 0x1F) << 6) + (code2 & 0x3F);
}
else if ((code1 & 0xF0) == 0xE0) /* 3字节 */
{
code2 = *++_ptr;
code3 = *++_ptr;
if (code2 == 0 || code3 == 0)
{
break;
}
unicode1 = ((uint32_t)(code1 & 0x0F) << 12) + ((uint32_t)(code2 & 0x3F) << 6) + (code3 & 0x3F);
}
else if ((code1 & 0xF8) == 0xF0) /* 4字节 */
{
code2 = *++_ptr;
if (code2 == 0)
{
break;
}
}
else
{
code2 = *++_ptr;
if (code2 == 0)
{
break;
}
}
/* 将UNICODE码转换为GB2312 */
if (unicode1 > 0xFFFF)
{
break;
}
gb = ff_convert(unicode1, 0); /* Unicode -> OEM */
code1 = gb >> 8;
code2 = gb;
if (len + 2 < gbk_size)
{
*_pOut++ = code1;
*_pOut++ = code2;
len += 2;
}
}
}
_ptr++;
}
*_pOut = 0;
return gbk;
} |