linux下转格式函数iconv段错误

今天将windows代码移植到Linux下,其中用到了Unicode转char的函数,被坑了一会,相关函数及编码格式,Linux与windows不同,有几点需要注意:

1、wchar_t 在Linux下占用4个字节,在windows下占2个字节;

2、Linux默认的文本编码方式是UTF-8;Linux终端汉字显示的设置方式:vi /etc/sysconfig/i18n;

设置LANG=“en_US.UTF-8”或者LANG=“zh_CN.UTF-8”;

3、iconv函数的调用方式:

iconv(iconv_t en, char** inbuf, size_t inlen, char** outbuf, size_t outlen);

段错误引发的关键之处就在这里了。

对于输入buffer与输出buffer,我之前用的是数组:strin[N][strlen];而我每次只处理二维数组中的一个数组,于是inbuf = (char**)(&strin[i]);

outbuf也是以类似的方式定义的,这样执行下去就一直报段错误,或者说segment error;

修改成这样就行了:

char* intemp = strin[i];
inbuf = &intemp;

outbuf也以类似的方式定义及解决问题。

4、Linux还有一个系统小工具iconv,

可以通过指令

iconv --list

来看Linux支持哪些文本格式,Unicode格式的名字可以填:UNICODE、UCS-2

还可以通过指令:

iconv -f UCS-2 -t UTF-8 test.txt -o output.txt

来测试格式转码是否能成功。

指令的含义:

iconv -f from_encoding -t to_encoding inputfile -o outputfile

5、另外还有个问题,在windows下通过tinyxml写XML文本,需要指定GBK格式,而在Linux下通过tinyxml写XML文件需要指定UTF-8编码;否则生成的XML文件为乱码。

linux下转格式函数iconv段错误,布布扣,bubuko.com

时间: 2024-10-28 22:53:49

linux下转格式函数iconv段错误的相关文章

Linux下运行C++程序出现"段错误(核心已转储)"的原因

今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错  这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题主要是程序试图访问内核段内存而产生的错误. 3.栈溢出  Linux默认给一个进程分配的栈空间大小为8M.c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中.  因此如果你数组开的过大变会出现这种问题.  首先我们先看一下系统默认分配的资源: 1 ulimit -a 可以看到默认分配的栈大

Linux下可执行文件格式详解

Linux下面,目标文件.共享对象文件.可执行文件都是使用ELF文件格式来存储的.程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件.Linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix系统的COFF文件格式演化来的. 我们先来了解一些基本的想法. 首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因: 1.程序执行之后,代码和数据可以被映射到不同属性的虚拟

linux下C语言函数执行时间统计

转载:http://blog.csdn.net/linquidx/article/details/5916701#t5 写好程序,用gcc编译,带上-pg参数,然后运行以后分析gmon.out文件: 命令exp:   gprof ./test-main ./gmon.out >1.log  在1.log中会生成各函数运行情况. gprof 1.1 简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口

Linux下使用system()函数一定要谨慎 【转载】

出处:http://blog.csdn.net/kyokowl/article/details/8823334 C/C++]Linux下使用system()函数一定要谨慎 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点.当初因为这个函数风险较多,故抛弃不用,改用其他的方法.这里先不说我用了什么方法,这里必须要搞懂syste

linux下的信号处理函数总结

1.信号处理函数 相关函数原型如下: #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处理器:             1.可以是SIG_DFL,信号的默认动作             2. 可以是SIG_IGN,忽略该信号             3. 一个带有一个整型参数的处理函数. #include <signal.h> int sigacti

windows linux 下安装mysql 报1045 等错误

曾经在windows 下安装mysql 没怎么出现过问题.而在linux下安装的时候出现了一些问题,昨天在windows 安装的时候也出现了1045 错误.就个人经历来看这个问题就是 root用户password的问题,所以将解决的方式总结例如以下: 一.mysql登录报 1045 错误 mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (us

转载:Linux下执行SVN命令时提示错误:Valid UTF-8 data

在Linux下执行svn add *时出现如下错误: svn:  Valid UTF-8  data(hex: 4b)followed by invalid UTF-8 sequence(hex:  fc 63 68  65) 出现这个错误是因为svn库里有文件的名字不是utf-8编码的,这种情况对于中文来说很常见.比如在自己的windows上建了一个中文名字的文件,就会使这种情况. 几经周折,才找到解决办法: 首先,执行命令: ls * | file -/dev/stdin:  ISO-885

Linux下利用ioctl函数获取网卡信息

linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函数成功返回0,失败返回-1. 其相关命令接口如下: 类别 Request 说明 数据类型 套 接 口 SIOCATMARK SIOCSPGRP SIOCGPGRP 是否位于带外标记 设置套接口的进程ID 或进程组ID 获取套接口的进程ID 或进程组ID int int int 文 件 FIONBIO

linux下自动化格式分区方法(非交互,可以用于shell脚本)

自动化格式分区方法----非交互---可用于脚本 要先给用户一个提示,让他选择一个分区来格式化 for i  in `mount|grep  "/dev/sdb"|awk '{print $1}'` do fuser –km $i;umount $i done dd if=/dev/zero  of=$PartDisk bs=512  count=1 sync;sleep 3 echo 'n p 1 +20M n p 2 +512M n p 3 +128M t 3 82 w'|fdis