[C CODE] BIG5 (ascii) to UTF-8 轉碼 sample code – use iconv , libiconv

#include "iconv.h"
#define MAX_STRING_LEN 10*1024

char tmp[MAX_STRING_LEN];
char p2[MAX_STRING_LEN];
iconv_t cd;
int v1 , v2;
char *sin , *sout;

cd = iconv_open("utf-8","big5");
if (cd==0) return -1;

// ----> LOOP
sin=p2;
sout=tmp;
v1=strlen(p2)+1;
v2=MAX_STRING_LEN;
if ( !iconv(cd,&sin,&v1,&sout,&v2) ) strcpy(dat[26],tmp);
else strcpy(dat[26],"Error");

// ----> LOOP END

iconv_close(cd);

這邊看到一句話:

首先 iconv_open() 函式就是做 “開啟” 動作,也就是當我們要將編碼系統 A 轉換到編碼系統 B 時,必須先呼叫此函式,將 FROMENC 設成編碼系統 A 的名字,同時將 TOENC 設成編碼系統 B 的名字,這時此函式就會做類似檔案開啟的動作,傳回一個代表此轉換管道的資料結構 iconv_t 供後續使用。事實上,在系統的實作中真的是將 iconv_open() 當作 “開啟檔案” 來處理,故它會受到目前系統或同一行程中可開啟檔案數所限,如果系統或程式的其他部分已開啟了太多的檔案以至於逼近系統上限,則有可能這邊的 iconv_open() 會失敗。

我想到一個問題 , 不曉得 PHP 裡面的 iconv 函式是否有同樣問題, 好像用 mbstring 安全一些!!

看來寫這種 convert encoding 的程式 真的要很小心 , 避免把 iconv_open 寫進 loop 裡面 , 免得他造成吃記憶體怪物!!