• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            怎樣學(xué)習(xí)使用libiconv庫(kù)

                libiconv庫(kù)是一個(gè)基于GNU協(xié)議的開(kāi)源庫(kù),主要是解決多語(yǔ)言編碼處理轉(zhuǎn)換等應(yīng)用問(wèn)題。
               
            怎樣學(xué)習(xí)使用libiconv庫(kù)?對(duì)于剛接觸到人來(lái)說(shuō),這篇文章不妨去看一看,若已經(jīng)用到過(guò)該庫(kù)的人,在應(yīng)用的過(guò)程中可能遇到一些問(wèn)題,我們可以一起來(lái)探討,我的聯(lián)系方式是 cnangel@gmail.com

                幾個(gè)函數(shù)原型:

            iconv_t iconv_open(const char *tocode, const char *fromcode);
            size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
            int iconv_close(iconv_t cd);

                其中:
            iconv_open
            是打開(kāi)一個(gè)編碼流,類(lèi)似于打開(kāi)一個(gè)編碼管道(通道),出錯(cuò)則返回 -1
            iconv
            用于具體輸入的轉(zhuǎn)換,如果出錯(cuò),則返回 -1,否則返回 0
            iconv_close
            是關(guān)閉該管道(通道)。
               
            舉個(gè)例子:

            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <iconv.h>

            #define OUTLEN 255
            int covert(char *, char *, char *, size_t , char *, size_t );

            int main(int argc, char *argv[])
            {
                char *input = "
            中國(guó)";
                size_t len = strlen(input);
                char *output = (char *)malloc(OUTLEN);
                covert("UTF-8", "GBK", input, len, output, OUTLEN);
                printf("%s\n", output);
                return 0;
            }

            int covert(char *desc, char *src, char *input, size_t ilen, char *output, size_t olen)
            {
                char **pin = &input;
                char **pout = &output;
                iconv_t cd = iconv_open(desc, src);
                if (cd == (iconv_t)-1)
                {
                    return -1;
                }
                memset(output, 0, olen);
                if (iconv(cd, pin, &ilen, pout, &olen)) return -1;
                iconv_close(cd);
                return 0;
            }

                這里面covert函數(shù)就是用于將編碼進(jìn)行轉(zhuǎn)換,其中要注意的地方是iconv函數(shù)的傳遞參數(shù):
            1
            iconv傳遞有5個(gè)參數(shù);
            2
            ,第3個(gè)參數(shù)和第5個(gè)參數(shù)一般是inputoutput實(shí)際分配的大小,一般是 sizeof(type)*strlen(string)
            3
            ,第4個(gè)參數(shù)是不能直接傳遞指針的地址,因?yàn)?span lang="EN-US">iconv
            函數(shù)能夠改變指針的值,所以需要復(fù)制一份指針變量;
               
            如果對(duì)于大量需要轉(zhuǎn)換的編碼,上述函數(shù)covert不適合該方式,一是內(nèi)存的限制不能一次調(diào)用,二是若分多次調(diào)用會(huì)頻繁打開(kāi)一個(gè)編碼管道(通道),導(dǎo)致資源浪費(fèi),最好的辦法還是拆開(kāi)該函數(shù)根據(jù)情況使用。
               
            這里補(bǔ)充一下代碼:
            translateSP.h

            #ifndef __TRANSLATESP_H_
            #define __TRANSLATESP_H_
            #include <iconv.h>
             
            class TranslateSP
            {
                 public:
                     TranslateSP():i_cd(0){}
                     TranslateSP(const char *from_charset,const char *to_charset)
                     {
                         i_cd = iconv_open(to_charset, from_charset);
                         if ((iconv_t)-1 == i_cd) printf("iconv open error!\n");
                     }
                     ~TranslateSP()
                     {  
                         if (i_cd)
                             iconv_close(i_cd);
                     }
             
                 public:
                     size_t translate(char *src, size_t srcLen, char *desc, size_t descLen);
                     size_t convert(const char *from_charset, const char *to_charset,
                             char *src, size_t srcLen, char *desc, size_t descLen);
             
                 private:
                     iconv_t i_cd;
            };
             
            #endif

            translateSP.cpp

            #include "translateSP.h"
             
            #define MAX_LEN 200
             
            size_t TranslateSP::translate(char *src, size_t srcLen, char *desc, size_t descLen)
            {
                 char **inbuf = &src;
                 char **outbuf = &desc;
                 memset(desc, 0, descLen);
                 return iconv(i_cd, inbuf, &srcLen, outbuf, &descLen);
            }
             
            size_t TranslateSP::convert(const char *from_charset, const char *to_charset,
                     char *src, size_t srcLen, char *desc, size_t descLen)
            {
                 char **inbuf = &src;
                 char **outbuf = &desc;
                 iconv_t cd = iconv_open(to_charset, from_charset);
                 if ((iconv_t)-1 == cd) return (size_t)-1;
                 memset(desc, 0, descLen);
                 size_t n = iconv(cd, inbuf, &srcLen, outbuf, &descLen);
                 iconv_close(cd);
                 return n;
            }
             
            int main(int argc, char *argv[])
            {
                 char *str = "
            我愛(ài)zhong國(guó)! %#@#";
                 char *str1 = "i
            大量需要轉(zhuǎn)換的編碼";
                 char *str2 = "
            函數(shù)就是用于將hello進(jìn)行轉(zhuǎn)換";
                 char newstr[MAX_LEN];
                 TranslateSP tsp;
                 tsp.convert("utf-8", "gbk", str, strlen(str), newstr, MAX_LEN);
                 printf("%s\n", newstr);
                 TranslateSP newtsp("UTF-8", "GBK");
                 newtsp.translate(str1, strlen(str1), newstr, MAX_LEN);
                 printf("%s\n", newstr);
                 newtsp.translate(str2, strlen(str2), newstr, MAX_LEN);
                 printf("%s\n", newstr);
                 return 0;
            }

            編譯:

            g++ translateSP.cpp -o test
            ./test
            我愛(ài)zhong國(guó)! %#@#
            i
            大量需要轉(zhuǎn)換的編碼
            函數(shù)就是用于將hello進(jìn)行轉(zhuǎn)換

            (以上輸出是GBK編碼)

             

            posted on 2009-09-10 23:52 肥仔 閱讀(1486) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 字符編碼

            亚洲欧美日韩精品久久亚洲区 | 久久婷婷五月综合97色直播| 亚洲国产成人久久精品影视| 久久精品国产精品亚洲精品| 99热精品久久只有精品| 精品亚洲综合久久中文字幕| 亚洲欧洲久久av| 国产精品乱码久久久久久软件| 久久国产精品一区| 香蕉久久夜色精品国产尤物| 久久午夜综合久久| 久久精品日日躁夜夜躁欧美| 1000部精品久久久久久久久| 成人a毛片久久免费播放| 久久国产视频99电影| 亚洲欧美伊人久久综合一区二区| 久久99国产乱子伦精品免费| 久久久久一区二区三区| 久久国产精品-国产精品| 久久久久国产精品| 久久久久黑人强伦姧人妻| 一本久久精品一区二区| 久久精品国产日本波多野结衣| 久久青青草原亚洲av无码app| 国产精品九九九久久九九| 久久se这里只有精品| 少妇久久久久久久久久| 污污内射久久一区二区欧美日韩| 婷婷伊人久久大香线蕉AV| 亚洲天堂久久久| 麻豆久久久9性大片| 精品久久久无码中文字幕| 久久99国产综合精品| 99久久国产热无码精品免费 | 大蕉久久伊人中文字幕| 午夜精品久久久久久久| 久久精品国产第一区二区三区| 久久人人爽人人爽人人片av麻烦 | 狠狠久久亚洲欧美专区 | 精品人妻伦九区久久AAA片69| 久久久一本精品99久久精品66|