linux下c语言字符编码转换
来源:互联网 发布:小学奥数 知乎 编辑:程序博客网 时间:2024/06/10 10:02
在实际工作中,网络传输报文内容字符编码约定为UTF-8编码,linux系统接收之后,要转换为GB18030才能正常使用接收到的报文内容,这里我们利用c语言来进行字符编码的转换。
首先,我们说下要用到的函数(linux下man命令得到函数说明):
- iconv_open:
#include <iconv.h>iconv_t iconv_open ( ToCode, FromCode) const char *ToCode, *FromCode;
The iconv_open subroutine initializes a code set converter. The code set converter is used by the iconv subroutine to convert characters from one code set to another.(iconv_open函数初始化一个字符转换标识,这个标识被iconv函数使用把字符从一种编码转换为另一种编码) - iconv:
size_t iconv (CD, InBuf, InBytesLeft, OutBuf, OutBytesLeft) iconv_t CD; char **OutBuf, **InBuf; size_t *OutBytesLeft, *InBytesLeft;
The iconv subroutine converts the string specified by the InBuf parameter into a different code set and returns the results in the OutBuf parameter.(iconv函数把InBuf参数指向的字符串转换成不同字符编码,结果保存在OutBuf参数中) - iconv_close:
int iconv_close ( CD) iconv_t CD;
The iconv_close subroutine closes a specified code set converter and deallocates any resources used by the converter.(iconv_close函数关闭指定的编码转换标识符并释放相关资源)
然后我们开始编码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iconv.h>
/**********************************************************************把来源字符串input从FromCode编码转换为以ToCode编码的目标字符串output*FromCode:来源字符串编码*ToCode :目标字符串编码*input :来源字符串*iLen :来源字符串长度*output :目标字符串*oLen :目标字符串长度**********************************************************************/int myEncodeConver(char *FromCode, char *ToCode, char *input, size_t *iLen, char *output, size_t *oLen){ char **InBuf = &input; char **OutBuf = &output; iconv_t CD; CD = iconv_open(ToCode, FromCode); if(CD == (iconv_t)-1) { printf("call iconv_open failed![%d][%s]\n", CD, strerror(errno)); return -5; } if(iconv (CD, InBuf, iLen, OutBuf, oLen)) { printf("Call iconv failed![%d][%s]\n",errno, strerror(errno)); iconv_close(CD); return -10; } iconv_close(CD); return 0;}
int main(int argc, char *argv[]){ char input[100]; //存储要转码的内容 size_t iLen = 100; //长度 size_t oLen = 100; //长度 char * output = NULL; //存储转码后的内容 int ret = 0; FILE * fp = NULL; char *filename = "inputFile.txt"; memset(input, 0x00, sizeof(input)); /*从文件inputFile.txt中读取要转码的内容*/ fp = fopen(filename, "r"); if(fp == NULL) { printf("open file[%s] error!\n", filename); return -5; } if( fgets(input, 100, fp)) { output = calloc(100, sizeof(char)); ret = myEncodeConver("UTF-8", "GB18030", input, &iLen, output, &iLen); if(ret) { printf("转码错误!\n"); free(output); output = NULL; fclose(fp); fp = NULL; return -10; } printf("input[%s]\n", input); printf("output[%s]\n", output); free(output); output = NULL; } fclose(fp); fp = NULL; return 0;}
编码完成,简单的写个makefile对程序编译:
test : test1.c gcc -o test test1.c -liconv.PHONY : cleanclean: rm -f *.o然后在windows下用记事本创建文件inputFile.txt,文件内容为:“大家好,我是追风的沙儿!Nice to meet you!88!”,文件保存为UTF-8编码,然后ftp到linux系统程序相同目录下(也可以在linux系统直接生成文件,用系统的iconv命令进行转码,具体大家可以用man iconv命令查看用法)。
最后执行./test命令运行程序,结果如下:
PS:
遇到的问题,刚开始直接在程序中给input变量赋值一个utf-8的字符串,但是程序报错:
Call iconv failed![116][Invalid wide character]
转码错误!
转码错误!
估计是input字符串在程序中并不是真正的utf-8编码,所以最后我选择从一个utf-8编码的文件读取字符串进行转换。
0 0
- linux下c语言字符编码转换
- linux下字符编码转换
- linux下字符编码转换
- linux下字符编码转换
- linux 下字符编码转换
- c语言实现字符编码转换
- C语言编码与字符转换
- linux c 字符编码转换函数 iconv
- Linux下字符编码转换 -- iconv命令
- linux终端下字符编码格式转换
- Linux 下的字符编码转换
- Linux/Windows 下字符编码转换
- linux 字符编码转换
- linux字符编码转换
- c语言字符编码
- c语言使用iconv函数实现字符编码转换
- linux 下转换指定目录下所有文件字符编码
- c语言字符转换
- 1.3 barn1
- Tomcat并发数优化的方法总结
- 计算cpu利用率和内存利用率
- ios百度地图实现多标记
- 1012. 数字分类
- linux下c语言字符编码转换
- Eclipse下使用SVN版本控制
- [MFC编程]三谈屏幕截图--关于图像的保存
- Ubuntu下如何将普通用户提升到root权限
- Linux内核与根文件系统的关系
- form表单提交编码的问题
- 成都国嵌-嵌入式linux必修实验手册完整版以及实验源码
- msado15.dll 使用心得
- 程序员级数据库优化要点