C语言实现几种编码形式的互转 -----(整理加原创)
2015-03-17 11:41
405 查看
一说起这种常见的比如 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,"&");//&//&&
p=p+5;
}
else if(need_covert_name[i] == 0x3c)
{
sprintf(p,"<");//<//<<
p=p+5;
}
else if(need_covert_name[i] == 0x3e)
{
sprintf(p,">");//>//>>
p=p+5;
}
else if(need_covert_name[i] == 0x22)
{
sprintf(p,""");//"//""
p=p+5;
}
else if(need_covert_name[i] == 0x27)//Audio Bit Rate
{
sprintf(p,"'");//'//''
p=p+5;
}
else
{
*p = need_covert_name[i];
p++;
}
}
}
因为使用的是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,"&");//&//&&
p=p+5;
}
else if(need_covert_name[i] == 0x3c)
{
sprintf(p,"<");//<//<<
p=p+5;
}
else if(need_covert_name[i] == 0x3e)
{
sprintf(p,">");//>//>>
p=p+5;
}
else if(need_covert_name[i] == 0x22)
{
sprintf(p,""");//"//""
p=p+5;
}
else if(need_covert_name[i] == 0x27)//Audio Bit Rate
{
sprintf(p,"'");//'//''
p=p+5;
}
else
{
*p = need_covert_name[i];
p++;
}
}
}
相关文章推荐
- base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互
- 常见的几种内排序算法以及实现(C语言)(转)
- base64编码、解码的C语言实现
- USB学习:C语言实现模拟对8bit数据的NRZI编码输出
- 几种编码的形式的介绍
- [置顶] 【Android 基础】Android按钮实现事件监听器四种常用形式+拓展几种形式
- base64编码、解码的C语言实现
- C语言实现的7种排序算法(整理和整合)
- [原创]堆排序 C语言实现
- 链表的各种题目整理(C语言实现)
- 实现 一个类,使得该类任何形式的 派生类 无论怎么定义和实现,都无法产生任何对象 实例 (原创)
- 几种编码的形式的介绍
- base64编码算法与c语言实现
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
- base64编码、解码的C语言实现
- base64编码、解码的C语言实现
- 哈弗曼编码的c语言实现代码
- 简单的银行系统C语言可实现--谈不上完全原创,也是作业的一部分
- 几种排序方法的实现 (C语言)
- torrent文件解析,bencode编码文件解析及其c语言实现