日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

在Linux下使用iconv转换字符串编码

發布時間:2025/3/15 linux 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Linux下使用iconv转换字符串编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Linux下寫C程序,尤其是網絡通信程序時經常遇到編碼轉換的問題,這里要用到iconv函數庫。

iconv函數庫有以下三個函數

1 2 3 4 5 6 #include <iconv.h> iconv_t iconv_open(const char *tocode, const char *fromcode); //return (iconv_t)-1 if failed size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); //return (size_t)-1 if failed int iconv_close(iconv_t cd); //return -1 if failed

?

這三個函數的功能顯而易見,分別是打開一個iconv_t句柄,轉換字符串以及關閉一個iconv_t句柄。其中有必要一說的是iconv函數,這個函數十分容易用錯。

iconv函數的五個參數中,第一個參數是iconv句柄,第二、三個參數是需要轉換的字符串的地址和長度的地址,第四、五個參數是存儲結果的字符串的地址和長度的地址,注意這里傳的都是地址,因為這四個參數的值都有會被iconv函數改變。iconv會逐步的將*inbuf中的字符轉換到*outbuf中,并增加*inbuf指針減少*inbytesleft的值,以及增加*outbuf指針減少*outbytesleft的值。

iconv函數會因為以下四種原因停止并返回:

  • *input中遇到了一個非法的多字節序列,返回(size_t)-1并置errno=EILSEQ,返回時*inbuf指向非法字符的開頭。
  • *input全部轉換完,返回不可轉換的字符數。
  • *input中遇到了一個不完整的多字節序列,返回(size_t)-1并置errno=EINVAL,返回時*inbuf指向不完整字符的開頭。
  • *output空間不夠,返回(size_t)-1并置errno=E2BIG。
  • 以下給出一個示例函數,將一個字符串從utf-8轉換成gbk后再重新轉換成utf-8。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <iconv.h> #include <string.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> int charset_convert(const char *from_charset, const char *to_charset, char *in_buf, size_t in_left, char *out_buf, size_t out_left) { iconv_t icd; char *pin = in_buf; char *pout = out_buf; size_t out_len = out_left; if ((iconv_t)-1 == (icd = iconv_open(to_charset,from_charset))) { return -1; } if ((size_t)-1 == iconv(icd, &pin, &in_left, &pout, &out_left)) { iconv_close(icd); return -1; } out_buf[out_len - out_left] = 0; iconv_close(icd); return (int)out_len - out_left; } int main(int argc, char *argv[]) { char *from_str = "你好,中南。- Hello, CSU."; char *to_str_gbk, *to_str_utf8; int len; //utf-8 => gbk to_str_gbk = (char*)calloc(1, strlen(from_str) * 3); if (-1 == (len = charset_convert("UTF-8", "GB2312", from_str, strlen(from_str), to_str_gbk, strlen(from_str) * 3))) { perror("UTF8=>GBK error"); } //gbk => utf8 to_str_utf8 = (char*)calloc(1, len * 3); if (-1 == (len = charset_convert("GB2312", "UTF-8", to_str_gbk, len, to_str_utf8, len * 3))) { perror("GBK=>UTF8 error"); } //output printf("original : %s\n", from_str); printf("to gbk : %s\n", to_str_gbk); printf("gbk to utf8: %s\n", to_str_utf8); }

    ?

    我用的xshell連接到虛擬機,先將terminal的編碼設置為utf-8運行,結果如下

    1 2 3 original : 你好,中南。- Hello, CSU. to gbk : ?o?????£- Hello, CSU. gbk to utf8: 你好,中南。- Hello, CSU.

    ?

    再將terminal的編碼設置為gbk運行,結果如下

    1 2 3 original : 浣犲ソ錛屼腑鍗椼€? Hello, CSU. to gbk : 你好,中南。- Hello, CSU. gbk to utf8: 浣犲ソ錛屼腑鍗椼€? Hello, CSU.

    ?

    可見,在相應的編碼下,對應的字符串能正常顯示。

    http://vimersu.win/blog/2014/03/04/linux-iconv/

    總結

    以上是生活随笔為你收集整理的在Linux下使用iconv转换字符串编码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。