C中編碼轉換函式可移植問題

2021-09-14 04:56:04 字數 3137 閱讀 3860

在**中我們通常不可避免的出現一些中文,這個時候我們就要考慮到中文的編碼格式,如果不注意可能會導致亂碼或者資訊失真等問題。我們常用的中文編碼有gbk,gb2312,unicode等等。具體詳細的介紹看下面幾篇文章:

在c語言中,如果需要講編碼進行轉換,可以使用iconv系列函式。

標頭檔案以及常用函式:

#include

typedef

void

* iconv_t;

extern iconv_t iconv_open

(const

char

* to_code,

const

char

* from_code)

;extern size_t iconv

(iconv_t cd,

char

** restrict inbuf, size_t* in_left_buf,

char

** restrict outbuf, size_t* out_left_buf)

;extern

inticonv_close

(iconv_t cd)

;

函式說明

此函式說明將要進行哪兩種編碼的轉換,並返回乙個轉化控制代碼。

引數說明

extern size_t iconv

(iconv_t cd,

char

** restrict inbuf, size_t* in_left_buf,

char

** restrict outbuf, size_t* out_left_buf)

;

函式說明

此函式用於從inbuf中讀取資料並將轉換到指定編碼的的資料輸出到outbuf中,若轉換成功,則輸出本次轉化的位元組數,否則返回sizeof_t(-1)

引數說明

extern

inticonv_close

(iconv_t cd)

;

用於關閉iconv_open開啟的檔案描述符

#include

#include

#include

#include

#include

using namespace std;

string convertcode

(const string& p_str,

const

char

* from,

const

char

* to)

lenin = p_str.

length()

; lenout = buf_len;

sin =

(char

*)p_str.

c_str()

; sout = bufout;

// std::cout << sin << std::endl;

//std::cout << lenin << std::endl;

//std::cout << lenout << std::endl;

ret =

iconv

(cd,

&sin, static_cast>

(&lenin)

,&sout, static_cast>

(&lenout));

//errno:84:invalid or incomplate multibyte or wide characterif(

-1== ret)

} std:

:cout <<

"bufout:"

<< bufout << std:

:endl;

std:

:cout <<

"bufout end"

<< std:

:endl;

iconv_close

(cd)

; result.

assign

(bufout, buf_len - lenout)

;return result;

}int

main()

使用iconv函式進行轉換的時候可能會出現段錯誤,這裡出現這個錯誤的主要原因是注意看iconv函式的函式原型:

extern size_t iconv

(iconv_t cd,

char

** restrict inbuf, size_t* in_left_buf,

char

** restrict outbuf, size_t* out_left_buf)

;

長度為size_t的指標,int指標轉換為size_t指標在一些系統的轉換過程會出現問題,導致長度出現錯誤,記憶體越界,出現段錯誤。錯誤資訊如下:

program received signal sigse**, segmentation fault.

from_gbk (irreversible=0x7fffffffb188, outend=0x61d7c0 "", outptrp=

,inend=0xa7ffffffdb76 ,

inptrp=0x7fffffffb2e8, step_data=0x6157d0, step=0x615030) at ../iconv/loop.c:325

325 ../iconv/loop.c: no such file or directory.

size_t型別是在stddef.**件中定義。size_t的型別與作業系統相關,在32位架構中被普遍定義為:

typedef

unsigned

int size_t;

在64為機器中被定義為:

typedef

unsigned

long size_t;

int型別在32和64為機器上的長度都是4位,long在32位機器為4位,在64位機器為8位。所以在64為機器上,size_t和int指標轉換的過程中一定會出現問題,在32為系統中的正整數指標不會指標,但是負整數也會出現問題。

C 中的編碼轉換

好長時間沒有寫編碼轉換.今天寫了下特地放上來供大家以後用到就不用去找了.將乙個字串轉換成unicode型別的base64編碼的字串如下 convert.tobase64string encoding.unicode.getbytes unicodestring 紅色標明的是還可以轉換bigendia...

C 與C 網路傳輸中的編碼轉換

近期的專案因為客戶端用的是unity3d 使用c 服務端用的是c vs2013,windows 所以當他們相互傳輸中文字串的時候不能正常工作。經過一番研究,把最終的解決方案分享出來。本方案的思路就是保證服務端和客戶端間的通訊使用utf8編碼。所以他們在給對方發中文資料時候都要轉成utf8格式。服務端...

PHP iconv 函式字元編碼轉換的問題講解

把gb2312置換成utf 8 text iconv gb2312 utf 8 text 在用 text iconv utf 8 gb2312 text 過程中,如果遇到一些特別字元時,如 英文名中的 等等字元,轉換就斷掉了。這些字元後的文字都沒法繼續轉換了。針對這的問題,可以用如下 實現 1 te...