linuxでlibiconvライブラリを使用してトランスコード
4390 ワード
iconvコマンドはlinuxの下の文字セットの符号化の変換を実現します
Windowsの下のファイルはlinuxの下でよく文字化けします.windowsの下のファイルはGBKで符号化され、linuxの下のデフォルトのファイルはUTF-8で符号化されているので、libiconvライブラリのトランスコードが必要です.
1.iconvコマンドの使い方は以下の通りです。
iconv[オプション...][ファイル...]
入力/出力フォーマット仕様:
-f,--from-code=名前元のテキスト符号化
-t,--to-code=名前出力符号化
情報:
-l,--listはすべての既知の文字セットを列挙する
出力制御:
-c無効な文字を出力から無視
-o,--output=FILE出力ファイル
-s,--silentクローズ警告
--verbose印刷進捗情報
GBKをエンコードしたファイルHosts_GBKをUTF-8符号化のHOSTS_に変換UTF8.
例は次のとおりです.
iconv -f GBK -t UTF-8 Hosts_GBK > HOSTS_UTF8
2.iconv関数:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);この関数は、どの2つの符号化の変換を行うかを示し、tocodeはターゲット符号化であり、fromcodeは元の符号化であり、この関数は次の2つの関数で使用される変換ハンドルを返す.
詳細:http://linux.die.net/man/3/iconv_open
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);この関数はinbufから文字を読み出し、変換後にoutbufに出力し、inbytesleftは変換されていない文字数を記録し、outbytesleftは出力バッファの残りの空間を記録します.
詳細:http://pubs.opengroup.org/onlinepubs/009695399/functions/iconv.html
ほとんどの場合、inbufはNULLではなく、*inbufもNULLではありません.この場合、iconv関数は*inbufで始まるマルチバイトシーケンスを*outbufで始まるマルチバイトシーケンスに変換します.*inbufから読み取りを開始し、最大*inbytesleftバイト、変換後、*outbufから書き込みを開始し、最大*outbytesleftバイトです.
iconv関数は一度に1つのマルチバイト文字を変換し、文字変換のたびに*inbufは変換されたバイト数を増加させ、*inbytesleftはそれに応じて変換されたバイト数を減少させる.これに対応して、*outbufおよび*outbytesleftは、cdの変換状態を変更しながら、対応する操作をそのコピーに対して行う.
次の4つのケースでは、変換を完了できません.
1.入力に無効なマルチバイトシーケンスが含まれています.このとき、errnoはEILSEQに設定され、(size_t)(-1)が返されます.*Inbufは無効なシーケンスの左端を指します.
2.入力されたバイトシーケンスはすべて変換されました.すなわち*inbytesleftは0に減少しました.このときiconvは、今回の呼び出しで完了した変換の数を返します(可逆的な変換は計上されません).
3.入力は、不完全なマルチバイトシーケンスで終わります.このとき、errnoはEINVALに設定され、(size_t)(-1)が返されます.*Inbufは、不完全なマルチバイトシーケンスの左端を指します.
4.出力キャッシュ領域に次の文字を格納するのに十分なスペースがありません.このとき、errnoはE 2 BIGに設定され、(size_t)(-1)が返される.
もう1つのケースは、inbufがNULLまたは*inbufがNULLであるが、*outbufがNULLではなく、*outbufもNULLではない.この場合、iconv関数はcdの変換状態を初期状態に設定し、store a corresponding shift sequence at*outbufを試みる.*outbufから、*outbytesleftバイトまで書き込みます.このリセットされたシーケンスを格納するのに十分な出力キャッシュ領域がない場合、errnoをE 2 BIGに設定して戻ります(size_t)(-1).逆に、*outbufは書き込みのバイト数を増加させ、*outbytesleftは書き込みのバイト数を減少させる.
第3のケースは、inbufがNULLまたは*inbufがNULL、*outbufがNULLまたは*outbufがNULLである.この場合、iconv関数はcdの変換状態を初期状態に設定しようとする.
戻り値:
iconv関数は、今回の呼び出しで変換された文字数を返し、可逆的な変換は計上されません.エラーが発生すると、errnoが変更され、(size_t)(-1)が返されます.
エラー:
E 2 BIG*outbufには十分なスペースがありません.
ELSEQ入力には無効なマルチバイトシーケンスが含まれています.
EINVAL入力には、不完全なマルチバイトシーケンスが含まれます.
(3) int iconv_close(iconv_t cd);この関数は、変換ハンドルを閉じてリソースを解放するために使用します.
cコード例
// utf-8 gb2312, 。
iconv_t cd;
char src_utf8[20]="utf8 ";
char *inbuf=src_utf8;
int inen=strlen(inbuf);
int outlen=255;
char *outbuf=(char *)malloc(outlen);
cd=iconv_open("gb2312","utf-8");
iconv(cd,&inbuf,(size_t *)&inlen,&outbuf,&outlen);
printf("%s
",outbuf);
iconv_close(cd);
free(outbuf);