在Linux下使用iconv转换字符串编码
在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库。
iconv函数库有以下三个函数
1 |
#include <iconv.h> |
这三个函数的功能显而易见,分别是打开一个iconv_t句柄,转换字符串以及关闭一个iconv_t句柄。其中有必要一说的是iconv函数,这个函数十分容易用错。
iconv函数的五个参数中,第一个参数是iconv句柄,第二、三个参数是需要转换的字符串的地址和长度的地址,第四、五个参数是存储结果的字符串的地址和长度的地址,注意这里传的都是地址,因为这四个参数的值都有会被iconv函数改变。iconv会逐步的将*inbuf中的字符转换到*outbuf中,并增加*inbuf指针减少*inbytesleft的值,以及增加*outbuf指针减少*outbytesleft的值。
iconv函数会因为以下四种原因停止并返回:
*input中遇到了一个非法的多字节序列,返回(size_t)-1并置errno=EILSEQ,返回时*inbuf指向非法字符的开头。*input全部转换完,返回不可转换的字符数。*input中遇到了一个不完整的多字节序列,返回(size_t)-1并置errno=EINVAL,返回时*inbuf指向不完整字符的开头。*output空间不够,返回(size_t)-1并置errno=E2BIG。
以下给出一个示例函数,将一个字符串从utf-8转换成gbk后再重新转换成utf-8。
1 |
#include <iconv.h> |
我用的xshell连接到虚拟机,先将terminal的编码设置为utf-8运行,结果如下
1 |
original : 你好,中南。- Hello, CSU. |
再将terminal的编码设置为gbk运行,结果如下
1 |
original : 浣犲ソ锛屼腑鍗椼€? Hello, CSU. |
可见,在相应的编码下,对应的字符串能正常显示。
http://vimersu.win/blog/2014/03/04/linux-iconv/
在Linux下使用iconv转换字符串编码的更多相关文章
- windows下的文件到linux下乱码 iconv 修改文件编码
conv [选项...] [文件...] 有如下选项可用: 输入/输出格式规范:-f, --from-code=名称 原始文本编码-t, --to-code=名称 输出编码 信息:-l, --list ...
- linux下改变文件的字符编码
首先确定文件的原始字符编码: $ file -bi test.txt 然后用 iconv 转换字符编码 $ iconv -f from-encoding -t to-encoding file > ...
- linux下精确替换某个字符串
1.linux下精确替换某个字符串 sed -i 's/\<old\>/new/g' filename.txt 2.举例: 2.1有个文件名为filename.txt,内容如下: newd ...
- 怎么将linux下的项目转换成windows的VS2010下的项目?
怎么将linux下的项目转换成windows的VS2010下的项目? 不显示删除回复 显示所有回复 显示星级回复 ...
- Net Core 下 Newtonsoft.Json 转换字符串 null 替换成string.Empty
原文:Net Core 下 Newtonsoft.Json 转换字符串 null 替换成string.Empty public class NullToEmptyStringResolver : De ...
- linux iconv 转换文件编码
查看文件编码file -i filename 递归转换(包括子文件夹)find default -type d -exec mkdir -p utf/{} \;find default -type f ...
- Linux下时间格式转换及获取方法
Linux下使用clock_gettime给程序计时 #include <stdio.h> #include <unistd.h> #include <stdlib.h& ...
- 让linux下的eclipse支持GBK编码
原文链接:http://leaze.blog.51cto.com/83088/195584 今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的,而 ...
- Python3中转换字符串编码
在使用subprocess调用Windows命令时,遇到了字符串不显示中文的问题,源码如下:#-*-coding:utf-8-*-__author__ = '$USER' #-*-coding:utf ...
随机推荐
- Git存储用户名和密码(明文需谨慎)
当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只需在下 ...
- html5的自定义data-*属性与jquery的data()方法的使用
人们总喜欢往HTML标签上添加自定义属性来存储和操作数据.但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它副 ...
- struts2笔记03-ActionContext
1.概念 ActionContext是action的上下文,它包括action执行所需要的对象.struts2对每一个action都会创建一个新的ActionContext实例,同Action一样,是 ...
- 使用Ramdisk 加速 Visualstudio 编译调试
一般来说ASP.NET在执行的时候,会先动态编译在目录 C:\Windows\Microsoft.NET\Framework64\版本\Temporary ASP.NET Files 由于每次修改程序 ...
- Bash debug
Debugging bash scripts Bash can help us to find problems in bash scripts in some ways. You don't exp ...
- 【Windows 8 Store App】学习一:获取设备信息
原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093306.html 通常情况下我们需要知道用户设备的一些信息:deviceId, os ...
- oracle任务计划debug
crontab -eno crontab for root - using an empty onecrontab: installing new crontab"/tmp/crontab. ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- 链表-Reverse Linked List II
[题目要求直接翻转链表,而非申请新的空间] 这道题的一个关键在于,当m=1时,需要翻转的链表段前没有其他的结点(leetcode的测试用例不含头结点),这个特例给解题带来了一点小小的困难.一个比较直观 ...
- css学习笔记三
总结一下水平居中和垂直居中的方法,欢迎交流指正,共同进步! 1.水平居中 1.1):行内元素水平居中,在其父类设置text-align:center; 1.2): 块级元素水平居中有三种 第一种:定宽 ...