linux下c语言利用iconv实现utf-8转unicode

#include <stdio.h>
#include <stdlib.h>
#include
<string.h>
#include <iconv.h>

int main(int argc, char **argv)
{
  /* 目的编码,
TRANSLIT:遇到无法转换的字符就找相近字符替换
   *    IGNORE 
:遇到无法转换字符跳过*/
  //char *encTo =
"UNICODE//TRANSLIT";
  char *encTo =
"UNICODE//IGNORE";
  /* 源编码 */
  char *encFrom =
"UTF-8";

/* 获得转换句柄
   *@param
encTo 目标编码方式
   *@param encFrom
源编码方式
   *
   * */
  iconv_t cd =
iconv_open (encTo, encFrom);
  if (cd ==
(iconv_t)-1)
  {
   perror
("iconv_open");
  }

/* 需要转换的字符串 */
  char inbuf[1024] = "abcdef哈哈哈哈行";

  size_t srclen = strlen (inbuf);
  /* 打印需要转换的字符串的长度
*/
  printf("srclen=%d\n", srclen);

/* 存放转换后的字符串 */
  size_t outlen =
1024;
  char outbuf[outlen];
  memset (outbuf, 0,
outlen);

/* 由于iconv()函数会修改指针,所以要保存源指针 */
  char *srcstart =
inbuf;
  char *tempoutbuf = outbuf;

/* 进行转换
   *@param cd
iconv_open()产生的句柄
   *@param srcstart
需要转换的字符串
   *@param srclen
存放还有多少字符没有转换
   *@param tempoutbuf
存放转换后的字符串
   *@param outlen
存放转换后,tempoutbuf剩余的空间
   *
   *
*/
  size_t ret = iconv (cd, &srcstart, &srclen,
&tempoutbuf, &outlen);
  if (ret ==
-1)
  {
   perror
("iconv");
  }
  printf ("inbuf=%s, srclen=%d,
outbuf=%s, outlen=%d\n", inbuf, srclen, outbuf, outlen);
  printf
("print outbuf: ");
  int i;
  for (i=0; i<24;
i++)
  {
   printf("%2c",
outbuf[i]);
  }
  printf("\n");

/* 关闭句柄 */
  iconv_close (cd);

return 0;
}

下面做了一下函数的封装

#include <stdio.h>
#include <stdlib.h>
#include
<string.h>
#include <iconv.h>

int char_convert (char *encTo, char *encFrom, char *inbuf, size_t inlen, char
*outbuf, size_t outlen)
{
/* 获得转换句柄
*@param encTo 目标编码方式
*@param
encFrom 源编码方式
**/
iconv_t cd = iconv_open (encTo, encFrom);
if (cd ==
(iconv_t)-1)
{
perror ("iconv_open");
}

/* 由于iconv()函数会修改指针,所以要保存源指针 */
char *srcstart = inbuf;
char
*tempoutbuf = outbuf;

/*进行转换
*@param cd iconv_open()产生的句柄
*@param srcstart
需要转换的字符串
*@param inlen 存放还有多少字符没有转换
*@param tempoutbuf
存放转换后的字符串
*@param outlen 存放转换后,tempoutbuf剩余的空间
**/
size_t ret = iconv
(cd, &srcstart, &inlen, &tempoutbuf, &outlen);
if (ret ==
-1)
{
perror ("iconv");
}
printf ("inbuf=%s, inlen=%d,
outbuf=%s, outlen=%d\n", inbuf, inlen, outbuf, outlen);
/* 关闭句柄
*/
iconv_close (cd);

return inlen;
}

#if 0
int main(int argc, char **argv)
{
/* 目的编码,
TRANSLIT:遇到无法转换的字符就找相近字符替换
* IGNORE :遇到无法转换字符跳过*/
//char *encTo =
"UNICODE//TRANSLIT";
char *encTo = "UNICODE//IGNORE";
/* 源编码
*/
char *encFrom = "UTF-8";
/* 需要转换的字符串 */
char inbuf[1024] =
"发送打法abcdef哈哈哈哈行";
size_t inlen = strlen (inbuf);
/* 打印需要转换的字符串的长度
*/
printf("inlen=%d\n", inlen);

/* 存放转换后的字符串 */
size_t outlen = 1024;
char
outbuf[outlen];
memset (outbuf, 0, outlen);

char_convert (encTo, encFrom, inbuf, inlen, outbuf, outlen);
printf
("print outbuf: ");
int i;
for (i=0; i<24;
i++)
{
printf("%2c", outbuf[i]);
}
printf("\n");

encFrom = "UNICODE";
/* 源编码 */
encTo =
"UTF-8//IGNORE";
char_convert (encTo, encFrom, outbuf, inlen, inbuf,
outlen);

printf ("print outbuf2: ");
for (i=0; i<24;
i++)
{
printf("%2c", inbuf[i]);
}
printf("\n");

}
#endif

时间: 2024-08-07 08:24:02

linux下c语言利用iconv实现utf-8转unicode的相关文章

笔记整理——Linux下C语言正则表达式

Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论阅读评论 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库. C语言处理正则表达式常用的函数有regcomp

Linux下C语言编程基础学习记录

VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s文件转化为*.o的二进制目标代码文件. 链接阶段:将*.o文件转化为可执行文件. 生成可执行文件:将*.o转换为可执行文件. 执行可执行C语言文件. gcc常用选项列表 -c      只编译不链接,生成目标文件“.o” -S      只编译不汇编,生成编码代码 -E      只进行预编译,不做

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window

Linux下C语言执行过程(预处理,编译,汇编,链接,执行)

1.C语言的执行过程包括5个步骤:分别是:预处理,编译,汇编,链接,执行 第一步:编写C源代码,截图如下: 2.预处理,命令为:gcc -E variable.c -o variable.i(这步的作用是文件的展开和宏替换),生成的文件类型是.i类型的. 3.编译:命令为:gcc -S variable.i -o variable.s,这里的.s文件就成了会变语言,截图如下: 4.汇编,命令是:gcc -c variable.s -o variable.o,截图如下: 5,链接:命令:gcc -

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.ico

Linux下C语言使用openssl库进行加密

在这里插一小节加密的吧,使用openssl库进行加密. 使用MD5加密 我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  .虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符.所以在下面的代码中才会有\n. 1 //打开/usr/

Linux下C语言的几道经典面试题

本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 2.C语言程序不使用任何条件运算符,打印出十次"Hello"? 答案如下: 或是: 3.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 4.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 5.如果在Linux下使用GCC编

Linux下C语言多线程,网络通信简单聊天程序

原文:Linux下C语言多线程,网络通信简单聊天程序 功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天.但至今没想出合适的退出机制,除了用Ctr+C.出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端.应用select函数来实现异步的读写操作. 先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环.这样每当有一个新的“连接”被接受都会创建一个新的线程,实现