深入探究Linux中的libiconv编码转换机制 (linux libiconv)

在Linux操作系统中,编码转换是一个极为重要的机制。在不同的场景下,文件的编码格式可能存在差异,而不同编码格式之间的互通则需要编码转换的支持。在Linux系统中,libiconv是一个非常常用的编码转换库。

libiconv 介绍

libiconv 是一个开源的编码转换库,可用于将一种编码格式转换成另一种编码格式。如果你需要处理不同的文字编码,这个库会帮助你方便地进行文本格式的转换。目前,libiconv 库已经被大量应用在许多操作系统和软件中。

libiconv 提供了以下几个功能:

– 实现了大量的编码格式的转换,包括 UTF-8, Unicode, GB2312 等;

– 支持海量的编码转换;

– 对转换中出现的错误进行了处理和修复;

– 支持输出最小编码序列。

libiconv 基本用法

下面我们来看一下 libiconv 的基本用法:

1. 打开 libiconv,获取指向转换描述符的指针。

2. 初始化转换描述符。

3. 执行转换操作。

4. 释放转换描述符。

具体代码如下:

1. #include

2. iconv_t iconv_open(const char *tocode, const char *fromcode);

3. size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);

4. int iconv_close(iconv_t cd);

其中,iconv_open() 函数用于打开 libiconv 库,获取到一个转换描述符;iconv() 函数用于执行实际的编码转换操作;iconv_close() 函数用于关闭描述符。

使用 iconv() 进行编码转换有几个要点:

1. 转换数据保存在输入缓冲区和输出缓冲区,而不是用户自己定义的数据结构中。

2. 转换函数会改变输入/输出缓冲区中的指针。

3. libiconv 库仅仅转换字符,而不是整个文本。

4. 当转换遇到错误时,转换操作会停止,函数也将返回相应的错误信息。

5. 需要注意的是,输入输出缓冲区的大小要比需要转换的数据的大小高出一定的余量,用于转换后添加结尾字符等。

iconv() 函数的常见参数如下:

– cd:转换描述符;

– inbuf:输入缓冲区的指针;

– inbytesleft:输入缓冲区中剩余的字符数;

– outbuf:输出缓冲区的指针;

– outbytesleft:输出缓冲区中剩余的字符数。

实际用例

下面我们通过一个实际的用例来学习 libiconv 的使用方法。假设我们需要将一个 GB2312 编码的字符串转换为 UTF-8 编码。具体代码如下:

“`

#include

#include

#include

#include

int mn()

{

const char *from_charset = “GB2312”;

const char *to_charset = “UTF-8”;

iconv_t cd;

char *inbuf = “我们中国人”;

char *outbuf = (char *)malloc(strlen(inbuf)*2+1);

size_t inlen = strlen(inbuf);

size_t outlen = strlen(outbuf);

char *in = inbuf;

char *out = outbuf;

int ret;

cd = iconv_open(to_charset, from_charset);

if (cd == (iconv_t)-1) {

printf(“iconv_open fled!\n”);

return -1;

}

ret = iconv(cd, &in, &inlen, &out, &outlen);

if (ret == -1) {

printf(“iconv fled!\n”);

return -1;

}

iconv_close(cd);

outbuf[strlen(outbuf) – outlen] = 0;

printf(“%s\n”, outbuf);

free(outbuf);

return 0;

}

“`

上述程序中,我们先定义了输入的字符串 inbuf,并为其分配足够的内存。然后定义了输出缓冲区 outbuf,并为其分配足够的内存空间。接着,我们使用 iconv_open() 函数打开 libiconv 库,获取到转换描述符 cd,用来标识接下来的编码转换过程。在执行 iconv() 函数实际进行编码转换过程时,需要传入输入缓冲区指针、输入缓冲区大小、输出缓冲区指针以及输出缓冲区大小等参数。在执行完串转换后,我们需要销毁转换描述符,并释放内存空间。

相关问题拓展阅读:

如何在windows平台下编译比特币bitcoin客户端

很多朋友都知道如何在linux平台如何编译比特币程序,但是,到了windows平台,

就会感觉到无从下手. 其实, 比特币程序是跨平台的.

你要编译windows版的比特币程序,基本上有两种方法,一种是在linux平台

(推荐ubuntu 13.10)通过交叉编译的方法来编译.另外一种,就是直接在windows平台编译.

我想,你既然要在windows平台使用,我就详细介绍一下如何在windwows平台编译比特币程序.

我的平台:windows7

之一步:安装变编译环境QT和MINGW,msys

1、msys是一个在windows平台模拟shell的程序。

下载安装程序之后,通过安装管理程序,按安装以下内容:

From MinGW installation manager -> All packages -> MSYS

选正森中以下安装包

msys-base-bin

msys-autoconf-bin

msys-automake-bin

msys-libtool-bin

点 apply changes开始安装。他会自动下载安装好。

需要注意的是,确保不要安装msys-gcc和msys-w32api ,因为这吵清亏两个包和我们的编译系统发生冲突。

很多人出现一些莫名其妙的问题,就是因为这两个包。

2、安装 MinGW-builds

下载并解压缩升神 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到C盘根目录 C:\

注意我的目录结构。你尽量和我一样。

3、设置PATH环境变量,将C:\mingw32\bin;添加到之一个。

4、在命令行模式下输入 gc -v 会得到以下内容

c:\gcc -v

Using built-in specs.

COLLECT_GCC=c:\mingw32\bin\gcc.exe

COLLECT_LTO_WRAPPER=c:/mingw32/bin/../libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper.exe

Target: i686-w64-mingw32

Configured with: ../../../src/gcc-4.8.2/configure –host=i686-w64-mingw32 –build=i686-w64-mingw32 –target=i686-w64-mingw32 –prefix=/mingw32 –with-sysroot=/c/mingw482/iposix-dwarf-rt_v3-rev3/mingw32 –with-gxx-include-dir=/mingw32/i686-w64-mingw32/include/c++ –enable-shared –enable-static –disable-multilib –enable-languages=ada,c,c++,fortran,objc,obj-c++,lto –enable-libstdcxx-time=yes –enable-threads=posix –enable-libgomp –enable-libatomic –enable-lto –enable-graphite –enable-checking=release –enable-fully-dynamic-string –enable-version-specific-runtime-libs –disable-sjlj-exceptions –with-dwarf2 –disable-isl-version-check –disable-cloog-version-check –disable-libstdcxx-pch –disable-libstdcxx-debug –enable-bootstrap –disable-rpath –disable-win32-registry –disable-nls –disable-werror –disable-symvers –with-gnu-as –with-gnu-ld –with-arch=i686 –with-tune=generic –with-libiconv –with-system-zlib –with-gmp=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-mpfr=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-mpc=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-isl=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-cloog=/c/mingw482/prerequisites/i686-w64-mingw32-static –enable-cloog-backend=isl –with-pkgversion=’i686-posix-dwarf-rev3, Built by MinGW-W64 project’ –with-bugurl=

CFLAGS=’-O2 -pipe -I/c/mingw482/iposix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include’ CXXFLAGS=’-O2 -pipe -I/c/mingw482/iposix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include’ CPPFLAGS= LDFLAGS=’-pipe -L/c/mingw482/iposix-dwarf-rt_v3-rev3/mingw32/opt/lib -L/c/mingw482/prerequisites/i686-zlib-static/lib -L/c/mingw482/prerequisites/i686-w64-mingw32-static/lib -Wl,–large-address-aware’

Thread model: posix

gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)

至此,你的开发环境已经搭建好了,很简单吧

第二部分:下载bitcoin引用的外部库

我们把它们全部放在 C:\deps目录下

2.1 安装OpenSSL下载:

进入启动 MinGw shell 比如目录:(C:\MinGW\msys\1.0\msys.bat)运行这个msys.bat,就会启动一个shell环境,提示符是$

输入命令

cd /c/deps/

tar xvfz openssl-1.0.1g.tar.gz

cd openssl-1.0.1g

Configure no-shared no-dso mingw

make

等待几分钟后,就把openssl编译好了。

2.2 下载Berkeley DB

我们推荐使用 4.8版本

同样在msys shell环境下输入以下命令

cd /c/deps/

tar xvfz db-4.8.30.NC.tar.gz

cd db-4.8.30.NC/build_unix

../dist/configure –enable-mingw –enable-cxx –disable-shared –disable-replication

make

等待编译

2.3 安装Boost

msys命令:

cd C:\deps\boost_1_55_0\

bootstrap.bat mingw

b2 –build-type=complete –with-chrono –with-filesystem –with-program_options –with-system –with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage

2.4 安装Miniupnpc

cd C:\deps\miniupnpc

mingw32-make -f Makefile.mingw init upnpc-static

2.5下载 protoc 和 libprotobuf:

msys shell命令

cd /c/deps/protobuf-2.5.0

configure –disable-shared

make

2.6 qrencode:

命令

cd /c/deps/libpng-1.6.10

configure –disable-shared

make

ode:

cd /c/deps/qrencode-3.4.3

LIBS=”../libpng-1.6.10/.libs/libpng16.a ../../mingw32/i686-w64-mingw32/lib/libz.a” \

png_CFLAGS=”-I../libpng-1.6.10″ \

png_LIBS=”-L../libpng-1.6.10/.libs” \

configure –enable-static –disable-shared –without-tools

make

2.7 安装 Qt 5 库

在 windows命令行输入:

set INCLUDE=C:\deps\libpng-1.6.10;C:\deps\openssl-1.0.1g\include

set LIB=C:\deps\libpng-1.6.10\.libs;C:\deps\openssl-1.0.1g

cd C:\Qt\5.2.1

configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug

mingw32-make

set PATH=%PATH%;C:\Qt\5.2.1\bin

cd C:\Qt\qttools-opensource-src-5.2.1

qmake qttools.pro

mingw32-make

3. 下载Bitcoin 0.9.1

在msys shell下输入以下命令行:

cp /c/deps/libpng-1.6.10/.libs/libpng16.a /c/deps/libpng-1.6.10/.libs/libpng.a

cd /c/bitcoin-0.9.1

./autogen.sh

CPPFLAGS=”-I/c/deps/boost_1_55_0 \

-I/c/deps/db-4.8.30.NC/build_unix \

-I/c/deps/openssl-1.0.1g/include \

-I/c/deps \

-I/c/deps/protobuf-2.5.0/src \

-I/c/deps/libpng-1.6.10 \

-I/c/deps/qrencode-3.4.3″ \

LDFLAGS=”-L/c/deps/boost_1_55_0/stage/lib \

-L/c/deps/db-4.8.30.NC/build_unix \

-L/c/deps/openssl-1.0.1g \

-L/c/deps/miniupnpc \

-L/c/deps/protobuf-2.5.0/src/.libs \

-L/c/deps/libpng-1.6.10/.libs \

-L/c/deps/qrencode-3.4.3/.libs” \

./configure \

–disable-upnp-default \

–disable-tests \

–with-qt-incdir=/c/Qt/5.2.1/include \

–with-qt-libdir=/c/Qt/5.2.1/lib \

–with-qt-bindir=/c/Qt/5.2.1/bin \

–with-qt-plugindir=/c/Qt/5.2.1/plugins \

–with-boost-system=mgw48-mt-s-1_55 \

–with-boost-filesystem=mgw48-mt-s-1_55 \

–with-boost-program-options=mgw48-mt-s-1_55 \

–with-boost-thread=mgw48-mt-s-1_55 \

–with-boost-chrono=mgw48-mt-s-1_55 \

–with-protoc-bindir=/c/deps/protobuf-2.5.0/src

make

strip src/bitcoin-cli.exe

strip src/bitcoind.exe

strip src/qt/bitcoin-qt.exe

这样,你就得到了变异好的 bitcoin-cli.exe和bitcoind.exe ,bitcoin-qt.exe(windows QT图形界面的钱包软件)

linux C语言:如何在ISO8859-1和GB2312字符编码之间互相转换

libiconv 、libidn 印象里有这两个主要念友的转换库。

不过似乎 iso没办法完全互转 GB2312 吧?iso8859 系列是 8 位编码。GB2312 是 16 位编码。

其实 Linux 里面应该所有的仔桥槐处理过消樱程都试用 UTF-8 。只有输入输出时才进行编码转换。

  JAVA有一个public String(byte bytes, Charset charset)函数可以用指定字节数组和编码来构造字符串。一个public byte getBytes(Charset charset)函数把字符串按指定编码来得到字节数组。可以用档侍这两个函数来实现编码转换。

  下面是一个简单的例子,罩坦注意一下例子中的文字本身的编码,更好在自己的环物蠢桐境中用gb2312重新输入,不然可能是乱码。当然转换后输出肯定有一个是乱码,也肯能都是乱码。根据你的编辑器的编码格式有关。public class EncodingTest

{

public static void main(String args)

{

try

{

String gb = new String(“国标2312”.getBytes(),”gb2312″);

System.out.println(gb);

byte b = gb.getBytes(“gb2312”);

String ios = new String(b,”ISO”);

System.out.println(ios);

} catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

}

不用转裤芦扒换.GB2312就用ISO8859-1

GB2312 联读两个 bytes

从文件始或行的开始起读.

loop:

读 byte1;

如果 byte1 > 0xA0 则哗亏 读 byte2

byte1byte2 构成一个GB码,

如果胡昌 未到 EOF then goto loop;

如果 byte1

如果 未到 EOF, goto loop;

我只知道 enca命令可以直接转换字符编码。C应当能直接调用系统命令吧

关于linux libiconv的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入探究Linux中的libiconv编码转换机制 (linux libiconv)