Hàm iconv
thực hiện chuyển đổi bộ ký tự, chuyển đổi một ký tự multibyte
tại một thời điểm và đối với mỗi chuyển đổi ký tự, nó tăng *inbuf
và giảm *inbytesleft
theo số byte
đầu vào được chuyển đổi, nó tăng *outbuf
và giảm *outbytesleft
bởi số byte đầu ra được chuyển đổi và nó cập nhật trạng thái chuyển đổi có trong cd
.
Thư viện Libclamav
sử dụng hàm iconv
để chuyển đổi ký tự, an toàn chuỗi, xử lý các tệp PE.
Tên hàm
iconv
- perform character set conversion
Tóm tắt
#include <iconv.h>
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);
Mô tả
Đối số cd
phải là bộ mô tả chuyển đổi được tạo bằng hàm iconv_open
.
Trường hợp chính là khi inbuf
không phải là NULL
và *inbuf
cũng không phải là NULL
. Trong trường hợp này, hàm iconv
chuyển đổi chuỗi multibyte
bắt đầu từ *inbuf
thành chuỗi multibyte
bắt đầu từ *outbuf
. Tối đa *inbytesleft
byte, bắt đầu từ *inbuf
, sẽ được đọc. Tối đa *outbytesleft
byte, bắt đầu từ *outbuf
, sẽ được ghi.
Hàm iconv
thực hiện chuyển đổi bộ ký tự, chuyển đổi một ký tự multibyte
tại một thời điểm và đối với mỗi chuyển đổi ký tự, nó tăng *inbuf
và giảm *inbytesleft
theo số byte
đầu vào được chuyển đổi, nó tăng *outbuf
và giảm *outbytesleft
bởi số byte đầu ra được chuyển đổi và nó cập nhật trạng thái chuyển đổi có trong cd
. Việc chuyển đổi có thể dừng lại vì bốn lý do:
- Chuỗi multibyte đầu vào không hợp lệ. Trong trường hợp này, nó đặt
errno
thànhEILSEQ
và trả về(size_t)(-1)
.*inbuf
được để trỏ đến phần đầu của chuỗi multibyte không hợp lệ. - Chuỗi byte đầu vào đã được chuyển đổi hoàn toàn, tức là
*inbytesleft
đã giảm xuống0
. Trong trường hợp này,iconv
trả về số lượngchuyển đổi không thể đảo ngược
được thực hiện trong lệnh gọi hàm này. - Gặp phải chuỗi multibyte không hoàn chỉnh trong đầu vào và chuỗi byte đầu vào kết thúc phía sau nó. Trong trường hợp này, nó đặt
errno
thànhEINVAL
và trả về(size_t)(-1)
.*inbuf
sẽ trỏ trái tới phần đầu của chuỗi multibyte không hoàn chỉnh. - Bộ đệm đầu ra không còn chỗ cho ký tự được chuyển đổi tiếp theo. Trong trường hợp này, nó đặt
errno
thànhE2BIG
và trả về(size_t)(-1)
.- Một trường hợp khác là khi
inbuf
làNULL
hoặc*inbuf
làNULL
, nhưngoutbuf
không phải làNULL
và*outbuf
không phải làNULL
. Trong trường hợp này, hàmiconv
cố gắng đặt trạng thái chuyển đổi củacd
thành trạng thái ban đầu và lưu trữ một chuỗi dịch chuyển tương ứng tại*outbuf
. Hầu hết*outbytesleft
byte, bắt đầu từ*outbuf
, sẽ được ghi. Nếu bộ đệm đầu ra không còn chỗ cho trình tự đặt lại này, nó sẽ đặterrno
thànhE2BIG
và trả về(size_t)(-1)
; nếu không, nó tăng*outbuf
và giảm*outbytesleft
theo số byte được ghi. - Trường hợp thứ ba là khi
inbuf
làNULL
hoặc*inbuf
làNULL
, và outbuf là NULL hoặc *outbuf là NULL. Trong trường hợp này, hàmiconv
đặt trạng thái chuyển đổi củacd
về trạng thái ban đầu.
- Một trường hợp khác là khi
Giá trị trả về
Hàm iconv
trả về số ký tự đã chuyển đổi có tính chất không thuận nghịch trong lệnh gọi hàm này; các chuyển đổi có tính thuận nghịch thì không được tính. Trong trường hợp bị lỗi, nó đặt lỗi và trả về (size_t)(-1)
.
Lỗi
Có rất nhiều lỗi và các lỗi sau có khả năng xảy ra:
E2BIG |
There is not sufficient room at *outbuf (*outbuf không đủ chỗ). |
EILSEQ |
An invalid multibyte sequence has been encountered in the input (Bắt gặp một chuỗi multibyte không hợp lệ ở đầu vào). |
EINVAL |
An incomplete multibyte sequence has been encountered in the input (Bắt gặp một chuỗi multibyte không hoàn chỉnh ở đầu vào). |
Tương thích
POSIX:2001
Tương tự
iconv_open(3)
, iconvctl(3)
, iconv_close(3)
LibClamAV Error: [scan_biff_for_xlm_macros] Unexpected state value 4