iconv errno 7 是空间不够 22应该是字符格式不对
用linux C 下的函数调用创建中文目录、文件等,字符串的编码格式要求是utf-8格式的。
比如想要使用 int mkdir(const char *pathname, mode_t mode); 创建一个中文的目录。那么pathname的编码格式要求是utf-8的,而不能是gb3212/gbk的,否则就是乱码。
那么如果linux C下如何进行gbk<—->utf-8编码转换的编码装换的?使用的是iconv函数簇。
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
|
#include <iconv.h>
#include <stdio.h>
#include <string.h>
int
code_convert
(
const
char
*
from_charset
,
const
char
*
to_charset
,
char
*
inbuf
,
size_t
inlen
,
char
*
outbuf
,
size_t
outlen
)
{
iconv_t
cd
;
char
*
*
pin
=
&inbuf
;
char
*
*
pout
=
&outbuf
;
cd
=
iconv_open
(
to_charset
,
from_charset
)
;
if
(
cd
==
0
)
return
-
1
;
memset
(
outbuf
,
0
,
outlen
)
;
if
(
iconv
(
cd
,
pin
,
&inlen
,
pout
,
&outlen
)
!=
0
)
return
-
1
;
iconv_close
(
cd
)
;
return
0
;
}
int
u2g
(
char
*
inbuf
,
int
inlen
,
char
*
outbuf
,
int
outlen
)
{
return
code_convert
(
"utf-8"
,
"gb2312"
,
inbuf
,
inlen
,
outbuf
,
outlen
)
;
}
int
g2u
(
char
*
inbuf
,
size_t
inlen
,
char
*
outbuf
,
size_t
outlen
)
{
return
code_convert
(
"gb2312"
,
"utf-8"
,
inbuf
,
inlen
,
outbuf
,
outlen
)
;
}
int
main
(
)
{
const
char
*
utf8
=
"您好中国"
;
char
buff
[
1024
]
=
{
0
}
;
u2g
(
(
char
*
)
utf8
,
strlen
(
utf8
)
,
buff
,
sizeof
(
buff
)
)
;
printf
(
"%s\n"
,
utf8
)
;
printf
(
"%s\n"
,
buff
)
;
return
0
;
}
|
其中
iconv函数族的头文件是iconv.h,使用前需包含之。
#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。