初级会员
- 积分
- 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内的函数,使用点表完成转换。
|