OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2324|回复: 1

开发板以gb2312格式写文件的问题

[复制链接]

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-5-22
在线时间
22 小时
发表于 2022-9-6 16:12:19 | 显示全部楼层 |阅读模式
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内的函数,使用点表完成转换。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-5-22
在线时间
22 小时
 楼主| 发表于 2022-9-6 16:12:20 | 显示全部楼层
已解决,重写utf转换gbk的功能函数,不使用linux下的iconv.h内的函数,使用点表完成转换。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 12:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表