| 
 
初级会员 
 
	积分73金钱73 注册时间2020-5-22在线时间22 小时 | 
 
10金钱 
| 想要以gb2312格式写数据到文件内 在Linux下使用下面的程序可以写入文件,且使用notepad++查看文件,编码为gb2312,且中文正常显示
 交叉编译后,在开发板内执行,只有一个空文件。推测应该是libiconv这个库的问题
 
 进行了如下操作
 
 1、解压 libiconv-1.14.tar.gz;进入libiconv-1.14目录
 2、./configure --host=arm-none-linux-gnueabihf --enable-shared --enable-static --prefix=/opt/libiconv/      /*--enable-shared  共享  --enable-static 生成静态库*/
 
 3、make CROSS_COMPILE=arm-linux-none-gnueabihf- ARCH=arm
 4、make instal
 结果
 arm-none-linux-gnueabihf-gcc gbfile.c unicodetogb2312.c -o gbexe -liconv -L/opt/libiconv/lib
 
 /opt/libiconv/lib/libiconv.so: file not recognized: file format not recognized
 collect2: 错误: ld 返回 1
 
 
 
 程序如下
 #include <iconv.h>
 #include <stdio.h>
 #include<stdlib.h>
 #include <string.h>
 #include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 #include <string.h>
 #include <dirent.h>
 #include<stdint.h>
 #include <iconv.h>
 #include <ctype.h>
 #include "unicodetogb2312.h"
 #include "/home/wen/下载/libiconv-1.17/include/iconv.h"
 #include "/usr/local/include/iconv.h"
 #include "/usr/include/iconv.h"
 #include "/opt/libiconv/include/iconv.h"
 
 /*
 字符串中转函数,由u2g和g2u函数调用
 from_charset 被转换的格式
 to_charset  要转换的格式
 inbuf 要转换的数据
 inlen 要转换的数据长度
 outbuf 存放被转换的数据
 outlen 被转换的数据长度
 */
 int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen,
 char *outbuf, size_t outlen)
 {
 iconv_t cd;
 int rc;
 char **pin = &inbuf;
 char **pout = &outbuf;
 cd = iconv_open(to_charset,from_charset);
 if (cd<=0)
 {
 printf("open error\r\n");
 // perror("iconv_open error");
 return -1;
 }
 else
 {
 printf("open ok\r\n");
 }
 memset(outbuf,0,outlen);
 int ret = iconv(cd,pin,&inlen,pout,&outlen);
 if (ret==-1) return -1;
 iconv_close(cd);
 return ret;
 }
 /*
 utf-8转gb2312程序
 inbuf 要转换的数据
 inlen 要转换的数据长度
 outbuf 存放被转换的数据
 outlen 被转换的数据长度
 */
 int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen)
 {
 return code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, outlen);
 }
 /*
 gb2312转utf-8程序
 inbuf 要转换的数据
 inlen 要转换的数据长度
 outbuf 存放被转换的数据
 outlen 被转换的数据长度
 */
 int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
 return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
 }
 
 
 
 int write_file_gdb(FILE *fd,void *src,int len,int *counter);
 int write_file_utf(FILE *fd,void *src,int len,int  *counter);
 int main()
 {
 FILE *fd;
 // char a=0xc8,b=0xcb;
 fd = fopen("text.txt","w+");
 char a[20]="你会哦呵";
 char b[50];
 u2g(a,strlen(a),b,sizeof(b));
 printf("%s\r\n",b);
 // fprintf(fd,"%c%c",a,b);
 fputs(b,fd);
 fclose(fd);
 return 0;
 }
 
 
 /*
 写文件GDB格式
 fd 文件句柄
 src 要写的数据
 len 要写的长度
 counter 写的长度
 */
 int write_file_gdb(FILE *fd,void *src,int len,int *counter)
 {
 char buf[100]={0};
 if(fd==NULL)
 {
 return -1;
 }
 //utf8转GDB2312,不转则打开中文乱码
 u2g(src, len, buf, sizeof(buf));
 //写文件
 int  ret = fwrite(buf, 1,strlen(buf),fd);
 if (-1 == ret)
 {
 printf("Error: write file failed!\n");
 }
 (*counter)+=(len);
 return ret;
 }
 /*
 写文件utf格式(正常写,不含转换程序)
 fd 文件句柄
 src 要写的数据
 len 要写的长度
 counter 写的长度
 */
 int write_file_utf(FILE *fd,void *src,int len,int  *counter)
 {
 if(fd==NULL)
 {
 return -1;
 }
 int  ret = fwrite(src, 1,strlen(src),fd);
 if (-1 == ret)
 {
 printf("Error: write file failed!\n");
 }
 (*counter)+=(len);
 return ret;
 }
 
 
 
 
 | 
 
最佳答案
查看完整内容[请看2#楼] 已解决,重写utf转换gbk的功能函数,不使用linux下的iconv.h内的函数,使用点表完成转换。 |