Windows下字符编码转换
编程过程中我们经常会遇到字符编码问题,比如数据库中使用的是UTF-8,我们程序中使用GBK,在脚本语言如Python和PHP中问题比较容易解决,因为这些语言中都有相应的库。那我们在C语言或者C++编程过程中遇到字符编码转换应该怎么办呢,下面是我的解决方案。
我们作为程序员,不仅仅是一个编码者,也应该是个架构者,也就是说如果有现成的模块可以使用就没有必要从头开始,我们首先想到用库,如果已经有了编码转换的库那问题就解决了,上网Google下,发现比较常用的是iconv库,这个库是在Linux下的,如果用到Windows下需要其它的环境依赖库,经过在论坛上寻找,发现有高手已经根据iconv写了windows版本的:http://code.google.com/p/win-iconv/downloads/list。我下载了下来,发现其中有CMakeLists.txt,我下载了Cmake,将其生成VC6.0下的工程,然后编译生成了iconv.dll和iconv.lib导出库,可以用了,在这里感谢作者的奉献O(∩_∩)O~。具体使用跟iconv自然是一样了,写了个测试程序试了下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "iconv.h"
4 #include "string.h"
5
6 int main(void)
7 {
8 char *src = "西安电子科技大学phoenix123"; /* 需转换的字串 */
9 char dst[1024] = {0}; /* 转换后的内容 */
10 char buf[1024] = {0}; /* 格式化转换后的字串 */
11 size_t src_len = strlen(src);
12 size_t dst_len = sizeof(dst);
13 char *in = src;
14 char *out = dst;
15 iconv_t cd;
16
17 cd = iconv_open("UTF-8","GBK");
18 if ((iconv_t)-1 == cd)
19 {
20 return -1;
21 }
22
23 printf("src: %s\n", src);
24 iconv(cd, (const char**)&in, &src_len, &out, &dst_len); /* 执行转换 */
25 printf("dst: ");
26 printf("%s\n",dst);
27
28 iconv_close(cd); /* 执行清理 */
29 return 0;
30 }
发现运行正常,满足了我的基本需求,此外,该库还支持多种字符编码的转换,详细可以见源码。