ARM开发板上iconv调用失败的解决方法

当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。而libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。在Linux下,工具链gcc有专门的libiconv库,所有不用移植,但在arm-linux下就没那么幸运了,需要我们额外移植libiconv库,不过,过程还是比较简单的。

一、字符编码转换libiconv库介绍

libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。主要函数有:

#include <iconv.h>

    iconv_ticonv_open(constchar *tocode,  const char *fromcode);

    size_ticonv(iconv_t cd,  char **inbuf,  size_t *inbytesleft,  char **outbuf,  size_t *outbytesleft);

    int iconv_close(iconv_tcd);

    iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回-1;

    iconv用于具体输入的转换,如果出错,则返回 -1,否则返回 0;

    iconv_close是关闭该管道(通道)。

如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。

二、arm-linux移植过程

1)http://www.gnu.org/software/libiconv/ 下载 libiconv-1.14.tar.gz

2)./configure CC=arm-hismall-linux-gcc --target=arm-linux--host=arm-hismall-linux --prefix=$PWD/out --enable-shared--enable-static

3) make

4) make install

上述命令执行完成后会在libiconv目录下生成新的out目录,该目录下存在4个目录分别是:
bin include lib share

在lib目录下为生成的库文件,其中一个为preloadable_libiconv.so,把它下载到开发板
的lib目录下,然后再设置开发板的系统环境变量:
$ export LD_PRELOAD=/lib/preloadable_libiconv.so

然后再执行应用程序即可,正常运行。

三、实例unicode.cpp

//#include <iconv.h>
#include <iostream>
#include <string.h>
#include "./iconv.h"
using namespace std;

// 代码转换操作类
class CodeConverter {
private:
    iconv_t cd;

public:
    // 构造
    CodeConverter(const char *from_charset, const char *to_charset)
    {
        cd = iconv_open(to_charset, from_charset);
    }

    // 析构
    ~CodeConverter()
    {
        iconv_close(cd);
    }

    // 转换输出
    int convert(char *inbuf, int inlen, char *outbuf, int outlen)
    {
        char **pin = &inbuf;
        char **pout = &outbuf;

        memset(outbuf, 0, outlen);
        return iconv(cd, pin, (size_t *)&inlen, pout, (size_t *)&outlen);
    }
};

int main(int argc, char **argv)
{
    char *gb2312 = "我是中国人";
    char out0[256] = {0};
    char out1[256] = {0};

    // gb2312-->utf-8
    CodeConverter cc0 = CodeConverter("gb2312","utf-8");
    cc0.convert(gb2312, strlen(gb2312)+1, out0, 256);
    cout << "gb2312-->utf-8 in=" << gb2312 << ",out0=" << out0 << endl;

    // utf-8-->gb2312
    CodeConverter cc1 = CodeConverter("utf-8", "gb2312");
    cc1.convert(out0, strlen(out0)+1, out1, 256);
    cout << "utf-8-->gb2312 in=" << out0 << ",out1=" << out1 << endl;    

    return 0;
}

arm-hismall-linux-g++ unicode.cpp -L./-liconv  //静态库然后nfs下载到板子上或直接运行就ok了。

如果遇到iconv转换异常,可用perror("iconv")来查看错误提示,以上代码我在FreeBSD下进行utf-8 -> gb2312转换失败,原因是iconv_open的两个参数都是小写的,而通过man iconv或iconv -l看到iconv支持的所有编码字符串均为大写。

时间: 2024-10-18 16:32:12

ARM开发板上iconv调用失败的解决方法的相关文章

vs自动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法

近日,在项目中需要引用java发布的WebService,添加服务引用后,调用一切正常. 配置如下: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="SecurityServiceImplServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize=&qu

[MS-SQL] SQL Server 2008 组态管理工具出现:远端进程调用失败 0x800706be 解决方法

[MS-SQL] SQL Server 2008 管理工具出现"远端进程调用失败 0x800706be"解决方法 因为项目需求电脑装的 SQL Server 是使用 SQL Server 2008 Express 版本,而自从安装完 VS 2012 之后原本正常的 SQL Server 竟然立马坏了,又因为时间总是太少事情总是太多,所以一直拖到最近才来找问题,不要问我那我工作怎办!因为至少 SQL 连远端的部分还是正常的! 问题由来 因为项目需求电脑装的 SQL Server 是使用

arm开发板上找不到/dev/i2c-*设备

最近在调试arm与外设iic通讯是,想来个投机取巧,先不写单独的驱动,直接通过iic bus设备是否可以连接到外设,然后发现在板子上找不到"/dev/i2c-n"的设备,标准的系统应该都是有的. 回去看内核驱动 代码位于 lichee/linux-3.10/drivers/i2c/ # # Makefile for the i2c core. # obj-$(CONFIG_I2C_BOARDINFO) += i2c-boardinfo.o obj-$(CONFIG_I2C) += i2

Qt Creator远程调试嵌入式ARM开发板上的Linux程序

背景 gdb的使用对于嵌入式开发人员来说是一项不可少的技能,远程调试对于 asd https://blog.csdn.net/baidu_31381143/article/details/53868924 原文地址:https://www.cnblogs.com/schips/p/12103765.html

SecureCRT上传文件失败的解决方法

以前用老版的secureCRT,上传大文件经常失败,要不是心疼我的机械键盘,不知道砸了多少次了. 所以,不要再管什么-a,-e,-b,-y了,直接换新版的secureCRT吧 我换了新版之后上传文件变得顺畅多了,砸键盘的冲动一下就没有了. 把我找的绿色版分享给大家.里面自带注册机. 链接:http://pan.baidu.com/s/1gfbnpkR 密码:p9y6 打开secureCRT之后,随便输入点东西进入到下一步,然后在注册机里生成一系列码, 在secureCRT中选择输入其他内容,就可

vs自己主动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法

近日.在项目中须要引用java公布的WebService,加入服务引用后,调用一切正常. 配置例如以下: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="SecurityServiceImplServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize=&

ARM开发板系统移植-----kernel的编译

前面一篇文章http://www.cnblogs.com/linzizhang/p/4817336.html介绍了开发板上系统软件的第一部分--bootloader的编译方法. 背景:把bootloader烧写到开发板的Nand Flash中后,开发板从Nand启动,硬件会自动将bootloader加载到内存中运行,bootloader将板载资源都初始化完成后,会停留在一个命令行界面,接收并执行用户敲入的命令.这时候用户可以通过命令控制开发板,比如查看参数列表:print.读写nand:nand

在STM32F746G-DISCO开发板上使用Nabto + FreeRTOS的演示热泵应用

当使用STM32 ARM Cortex-M微控制器时,ST的免费嵌入式软件STM32Cube提供了所有必要的驱动程序和中间件组件,以减少初始的开发工作.在上述提到的中间件组件中,其中一个是非常受欢迎的FreeRTOS实时操作系统,Nabto正在努力建立一个强大的FreeRTOS + Nabto组合的解决方案. 我们最新推出AppMyProduct应用平台可帮助您快速开发远程控制设备的高质量应用程序.本文介绍了在STM32F746G-DISCO开发板上使用Nabto + FreeRTOS的演示热泵

20150502 调试分析之 使用gdb远程调试ARM开发板

20150502 调试分析之 使用gdb远程调试ARM开发板 2015-05-02 Lover雪儿 今天我们要学习的是使用gdb和gdbserver来远程调试开发板程序. 下面是本人的一些具体步骤: 下载gdb-7.9.tar.gz地址: http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz 安装gdb tar -jxvf gdb-7.9.tar.bz2 ./configure -target=arm-none-linux-gnueabi --prefix=/hom