linux下iconv()関数の使い方


linux shellプロファイルのデフォルトの文字セットはUTF-8として符号化されます.UTF-8はunicodeの表現であり、gb 2312はunicodeと文字の符号化方式であるため、gb 2312とutf-8の概念は階層的ではないはずである.LINUX上で符号化変換を行う場合、指定されたファイルを1つの符号化から別の符号化に変換するiconvコマンドを使用して実現できます.
iconvコマンドの使い方を調べてみました.
iconv[オプション...][ファイル...]
次のオプションがあります.
入力/出力フォーマット仕様:
-f,--from-code=名前元のテキスト符号化
-t,--to-code=名前出力符号化
情報:
-l,--listはすべての既知の文字セットを列挙する
出力制御:
-c無効な文字を出力から無視
-o,--output=FILE出力ファイル
-s,--silentクローズ警告
--verbose印刷進捗情報
だから、プログラムの最後に直接一言追加しました.
iconv -f utf-8 -t gb2312/server_test/reports/software_.txt >/server_test/reports/software_asserts.txt
問題を解決した.
インターネットでいくつかの資料を調べたところ、LINUX上で符号化変換を行う場合、iconv関数ファミリープログラミングを利用して実現することもできることが分かった.
iconv関数ファミリーのヘッダファイルはiconvです.h、使用前に含める必要があります.
#include
iconv関数ファミリーには3つの関数があり、プロトタイプは以下の通りです.
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
この関数は、どの2つの符号化の変換を行うかを示し、tocodeはターゲット符号化であり、fromcodeは元の符号化であり、この関数は次の2つの関数で使用される変換ハンドルを返す.
(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
#define OUTLEN 255
main()
{
char *in_utf 8=「姝e?ㄥ??瑁?」
char *in_gb 2312=「インストール中」;
char out[OUTLEN];
//unicodeコードからgb 2312コードへ
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb 2312コードを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;
}
//UNICコードからGB 2312コードへ
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB 2312コードからUNICコードへ
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
#include
#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_utf 8=「姝e?ㄥ??瑁?」
char *in_gb 2312=「インストール中」;
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;
}

iconvコマンドによるファイル符号化変換


Linuxシステムのiconvコマンドは、man iconvで表示できるファイル全体の符号化変換を実現します.iconvコマンドの基本フォーマットは、次のとおりです.
<!-- lang: shell -->
iconv -f from-encoding -t to-encoding  input-file -o output-file

from-encodingとto-encodingの使用可能な値は、オプション-lで表示できます.
<!-- lang: shell -->
iconv -l

出力結果において、GB 2312、UTF-8、GB 18030、UTF 16を見つけることができる.上記の中国語コードファイル変換:
<!-- lang: shell -->
iconv -f GB2312 -t UTF8 display_utf8.c -o display_gb2312.c