Linux字符编码转换 UTF8转GB3212

在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 
   一、利用iconv函数族进行编码转换 
   iconv函数族的头文
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
   一、利用iconv函数族进行编码转换
   iconv函数族的头文件是iconv.h,使用前需包含之。
   #include <iconv.h>
   iconv函数族有三个函数,原型如下:
   (1) iconv_t iconv_open(const char *tocode, const char *fromcode);
   此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
   (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
   此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd);
   此函数用于关闭转换句柄,释放资源。
   例子1: 用C语言实现的转换示例程序

   /* f.c : 代码转换示例C程序 */
   #include <iconv.h>
   #define OUTLEN 255
   main()
   {
   char *in_utf8 = "姝e?ㄥ??瑁?";
   char *in_gb2312 = "正在安装";
   char out[OUTLEN];

   //unicode码转为gb2312码
   rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
   printf("unicode-->gb2312 out=%sn",out);
   //gb2312码转为unicode码
   rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
   printf("gb2312-->unicode out=%sn",out);
   }
   //代码转换:从一种编码转为另一种编码
   int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
   {
   iconv_t cd;
   int rc;
   char **pin = &inbuf;
   char **pout = &outbuf;

   cd = iconv_open(to_charset,from_charset);
   if (cd==0) return -1;
   memset(outbuf,0,outlen);
   if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
   iconv_close(cd);
   return 0;
   }
   //UNICODE码转为GB2312码
   int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
   {
   return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
   }
   //GB2312码转为UNICODE码
   int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
   {
   return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
   }

   例子2: 用C++语言实现的转换示例程序

   /* f.cpp : 代码转换示例C++程序 */
   #include <iconv.h>
   #include <iostream>

   #define OUTLEN 255

   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 *in_utf8 = "姝e?ㄥ??瑁?";
   char *in_gb2312 = "正在安装";
   char out[OUTLEN];

   // utf-8-->gb2312
   CodeConverter cc = CodeConverter("utf-8","gb2312");
   cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
   cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;

   // gb2312-->utf-8
   CodeConverter cc2 = CodeConverter("gb2312","utf-8");
   cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
   cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl;
   }
linux C 字符集转换,UTF-8,GB2312
最近帮朋友写个系统接口的小东东,2个系统字符集不同,一个采用UTF-8,一个采用GB2312,不得已需要转换字符集。转换函数记录如下:
#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OUTLEN 255
main()
{
char *in_utf8 = "utf8字符串";
char *in_gb2312 = "\xbe\xb2\xcc\xac\xc4\xa3\xca\xbd";

char out[OUTLEN];
int rec ;

//unicode码转为gb2312码
rec = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%s\n",out);
  
//gb2312码转为unicode码
rec = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%s \n",out);
}
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);

转载于:https://www.cnblogs.com/qingchen1984/p/4029105.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ULARGE_INTEGER运算

在调用GetDiskFreeSpaceEx()获取磁盘空间时&#xff0c;由于参数是ULARGE_INTEGER(64位整数)&#xff0c;所以普通的“加减乘除”并不支持(是没有实现)&#xff0c;因此我们采用其他办法来实现&#xff0c;先来看下ULARGE_INTEGER的结构定义&#xff1a; typedef union _ULARG…

IMG图片和文字同一行显示,图片和文字居中显示

问题其实很好解决&#xff0c;只要设定img标签的vertical-align CSS属性就好了&#xff0c;代码如下&#xff1a;

Leetcode刷题(6)有效的括号

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0…

eclipe安装中文语言包 CDT Pydev

一、中文语言包eclipse的国际化项目已经交由Eclipse宝贝项目来进行[url]https://babel.eclipse.org[/url]在线安装&#xff1a;&#xff08;1&#xff09;打开eclipse&#xff0c;菜单 Help -> Software Update …&#xff1b;&#xff08;2&#xff09;打开Software Update…

vue-环境变量和模式

vue项目使用.env文件配置全局环境变量 模式是 Vue CLI 项目中一个重要的概念。默认情况下&#xff0c;一个 Vue CLI 项目有三个模式&#xff1a; development 模式用于 vue-cli-service serve production 模式用于 vue-cli-service build 和 vue-cli-service test:e2e test 模…

printf的两个需要注意的问题:无符号整数和64位整数

From: http://www.cnblogs.com/lidp/articles/1696079.html 1) %d和%u的区别unsigned int dwValue;printf("%d", dwValue);在dwValue的值大于0x7FFFFFFF时&#xff0c;输出的结果会变成负数。正确的程序应该为&#xff1a;printf("%u", dwValue); 2) 使用…

CSS 相对|绝对(relative/absolute)定位系列(一)

1. 绝对定位和浮动元素是近亲&#xff1a;都具备包裹性和破坏性 包裹性&#xff1a;包裹性换种说法就是让元素inline-block化&#xff0c;例如一个div标签默认宽度是100%显示的&#xff0c;但是一旦被absolute属性缠上&#xff0c;则100%默认宽度就会变成自适应内部元素的宽度…

SharePoint 2013 List 备份使用

在测试环境新建List后经过不懈的调整&#xff0c;验证终于做出一个像模像样的表单。 这时候问题来。。。 要怎么迁移到生产环境或者正式环境呢&#xff1f; 在网上找了一些资料&#xff0c;不过都是10的。。 其实想想13跟10区别不大&#xff0c;于是顺利找到了解决方案 备份Lis…

javascript学习系列(24):数组中的substring方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说s…

LINUX下SYN***战

(一)SYN***原理SYN***属于DOS***的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费服务器CPU和内存资源.SYN***聊了能影响主机外,还可以危 害路由器,防火墙等网络系统,事实上SYN***并不管目标是什么系统,只要这些系统打开TCP服务就可以实施.我们知道,在网络中两台电脑建…

将一个BYTE数组转换成16进制字符串和10进制字符串格式

背景&#xff1a; unsigned char port[5]; 以02x的格式打印出来是 00 00 02 00 00 1.如何转成16进制形式的字符串&#xff0c;使得char *strport16 "0000020000"; 2.如何转成10进制形式的字符串&#xff0c;使得char *strport10 "131072"; C code:…

CSS 相对|绝对(relative/absolute)定位系列(二)

1. 因为事先标准就已经在文字的后面显示&#xff0c;设置absolute之后因为跟随性仍然是在原来的文字&#xff0c;然后再设置margin实现定位即可 2. absolute正业之元素隐藏 元素隐藏与显示是我们在页面制作与交互效果实现中非常常见的&#xff0c;如果您只是使用display:none与…

7天后自动更新cookie

原生js操作cookie 6s后cookie自动删除 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv&…

js中replace的用法

replace方法的语法是&#xff1a;stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string)&#xff0c;reExp可以是正则表达式对象(RegExp)也可以是字符串(string)&#xff0c;replaceText是替代查找到的字符串。。为了帮助大家更好的理解&#xff0c;下面举个简…

ospf 单区域配置

在骨干区域(eare0)中:配置方法:router ospf 进程号如:10network 加 你想宣告的网段 反向子网掩码 area 加id 号假如是在路由器的接口ip 是 192.168.1.1 和192.168.2.1 在area 0 中 router ospf 10network 192.168.1.0 0.0.0.255 area 0network 192.168.2.0 0.0.0.255 area 0就可…

javascript学习系列(25):数组中的substr

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说s…

CSS 相对|绝对(relative/absolute)定位系列(三)

1. absolute与等高布局 拿简单的两栏布局举例&#xff0c;左栏与右栏有不同的背景色&#xff0c;且中间隔边框线分隔&#xff0c;如何实现&#xff1f;因为随着内容的不同&#xff0c;有可能左侧栏高度较高&#xff0c;也有可能是右侧栏高度较高。所以&#xff0c;要实现无缝的…

CPUID详解[增加TLB与Cache]

From: http://bbs.pediy.com/showthread.php?threadid21646 标 题:CPUID详解[增加TLB与Cache]作 者: Pr0Zel 时 间: 2006-02-21,22:00:23 链 接: http://bbs.pediy.com/showthread.php?t21646 这是文章最后一次更新,加入了TLB与Cache信息等资料前言:论坛上面有人不明白CPUID指…

2009年5月软件设计师考前预测试题及考点解析

更多试题及要点解析请参见《软件设计师考试考前冲刺预测试卷及考点解析》、《应试捷径--典型考题解析与考点贯通(系统分析师考试)》&#xff0c;不断更新中&#xff0c;敬请持续关注&#xff01;