场景:
1.在windows上我们可以通过WideCharToMultiByte和MultiByteToWideChar直接转换或间接转换编码,但是在linux或mac上却没有那么方便的系统api了,这时候可以使用libiconv库来进行转码,质量还是很高的。
2.以下我们把utf8编码字符串转换为utf16-le(小端序)编码。
文件test_iconv.cpp,是utf8编码。
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "iconv.h" int GetUtf8LetterNumber(const char *s) { int i = 0, j = 0; while (s[i]) { if ((s[i] & 0xc0) != 0x80) j++; i++; } return j; } int main(int argc,char *argv[]) { iconv_t cd = NULL; cd = iconv_open("UTF-16LE", "UTF-8"); char *inptr = (char*)"我们的国家"; char* inptr1 = inptr; size_t length_i = strlen(inptr); printf("length_i %d\n",length_i); size_t length = GetUtf8LetterNumber(inptr)*2; size_t lengtht = length; printf("length %d\n",length); char* temp_dest = (char*)malloc(length+2); char* temp_destt = temp_dest; memset(temp_dest,0,length+2); size_t result = iconv(cd, &inptr1, &length_i, &temp_dest, &length); if (result != (size_t) -1) { iconv_close(cd); } printf("length %d\n",length); printf("length_i %d\n",length_i); for(int i = 0;i<lengtht;++i) { printf("%x\n",(unsigned char)temp_destt[i]); } }
length_i 15 length 10 length 0 length_i 0 11 62 ec 4e 84 76 fd 56 b6 5b
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);
The iconv function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements *inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted output bytes, and it updates the conversion state contained in cd.看这里有iconv函数解释地址:
http://www.gnu.org/savannah-checkouts/gnu/libiconv/documentation/libiconv-1.13/iconv.3.html
这里是支持的编解码列表:
http://www.gnu.org/savannah-checkouts/gnu/libiconv/documentation/libiconv-1.13/iconv_open.3.html