在**中我們通常不可避免的出現一些中文,這個時候我們就要考慮到中文的編碼格式,如果不注意可能會導致亂碼或者資訊失真等問題。我們常用的中文編碼有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...