C语言实现几种编码形式的互转 -----(整理加原创)

该博客介绍了在ST平台下,由于裁剪导致不能使用<iconv.h>进行编码转换的问题。作者提供了一种C语言实现GB2312、UTF-8和ISO-8859-1之间转换的方法,包括`name_convert_to_utf8`和`Special_Symbol_Convert`两个关键函数,用于处理特殊字符和不同编码形式的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一说起这种常见的比如 GB2312/UTF-8 或 ISO-8859-1/UTF-8 之间的互转,想必大家肯定会说,用#include <iconv.h> 就可以了呀,我们可以调用code_convert();函数 ,只要传参数正确,还用那么麻烦,用C语言转换么???

因为使用的是ST平台.所以我们特别喜欢的code_convert();函数的神奇魔力仿佛被施了魔法被困住.因为裁剪的原因.我们只可以使用部分的转码. 那么问题来了.GB2312/UTF-8 或 ISO-8859-1/UTF-8 互转不支持.尝试了好久,最终看见了裁剪,才恍然大悟.(见我的资源库)

以下是部分代码,详尽代码见资源库

1.iconv 函数

/*********************************************************************************************
*Authors & Time:_lixuezheng_2014/09/22_make function_
*Function : name_convert_to_utf8
*Parameter:from_name,to_utf8_name
*Return : 0
*********************************************************************************************/
void name_convert_to_utf8(u_char *from_name,u_char *to_utf8_name)
{
if(from_name[0]>0 && from_name[0]<0x20)
{


switch(from_name[0])
{

case 0x13:
/*__2_gb2312_0x13___*/
gb2312_to_utf8(&from_name[1],to_utf8_name);
break;

case 0x10:
/*__3_iso-8859-1_0x10___*/
iso8859_1_to_utf8(&from_name[1], to_utf8_name);
break;


case 0x11:
case 0x14:
/*_4_big5_0x11__&&__5_ISO_10646_0x14*/
code_convert("UCS-2BE","utf-8",&from_name[1],32,to_utf8_name,32);
break;
default:
filtrateCharacter(from_name,to_utf8_name);
break;
}
}
else
{
if(gb2312_to_utf8(from_name, to_utf8_name) == NULL)
{
filtrateCharacter(from_name,to_utf8_name);
}


}


}

2.特殊字符转义.

/*********************************************************************************************
*Authors & Time:_lixuezheng_2014/10/08_make function_
*Function : Special_Symbol_Convert for Encoder Top_menu OEM and Device.
*Parameter:Maybe need  covert  name
*Return : 0
*********************************************************************************************/
void  Special_Symbol_Convert(u_char *need_covert_name,u_char *after_covert_name,int num)
{
int i;
char *p = NULL;


p = after_covert_name;


//special_symbol need convert ( & is 0x26 )( < is 0x3c )( > is 0x3e )( " is 0x22 )( ' is 0x27 )
for(i = 0;i<num ;i++)
{
if(need_covert_name[i] == 0x26)
{
sprintf(p,"&#38;");//&#38;//&amp;&
p=p+5;
}
else if(need_covert_name[i] == 0x3c)
{
sprintf(p,"&#60;");//&#60;//&lt;<
p=p+5;
}
else if(need_covert_name[i] == 0x3e)
{
sprintf(p,"&#62;");//&#62;//&gt;>
p=p+5;
}
else if(need_covert_name[i] == 0x22)
{
sprintf(p,"&#34;");//&#34;//&quot;"
p=p+5;
}
else if(need_covert_name[i] == 0x27)//Audio Bit Rate
{
sprintf(p,"&#39;");//&#39;//&apos;'
p=p+5;
}
else
{
*p = need_covert_name[i];
p++;
}
}


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值