项目里面第一次尝试使用DB2数据库,在windows端进行调试的时候发现取到的中文是ascii编码的,数据库设置的是UTF-8。
于是想到两个思路解决问题:
1:再尝试通过数据库的设置从而直接取出utf-8的编码;
2:从数据库中取到ascii的编码后再进行转换utf-8;
第二个思路功能单一,正好是检查新员工素质的时候啊,于是给几个新员工提了一个任务:使用昨天配置的eclipse c++环境编写一个函数,函数功能:转换中文的编码(ascii---utf-8)
要求:
1:有错误处理,编码格式错误要throw异常;
2:函数有注释,使用上我给的注释模板
3:要求有main函数。测试编码转换函数的时候,通过文件读写来进行字符串的读写。例如写两个文件,相同的中文,不同的编码。通过文件读到ascii中文,最后输出到utf-8的文件,自己一对比也知道函数转换对不对了
4:一天完成,相互鼓励讨论,不鼓励copy code
那么写个简单测试程序吧:
果然如想象的一样,windows下和linux下的输出是不一样的。
于是想到两个思路解决问题:
1:再尝试通过数据库的设置从而直接取出utf-8的编码;
2:从数据库中取到ascii的编码后再进行转换utf-8;
第二个思路功能单一,正好是检查新员工素质的时候啊,于是给几个新员工提了一个任务:使用昨天配置的eclipse c++环境编写一个函数,函数功能:转换中文的编码(ascii---utf-8)
要求:
1:有错误处理,编码格式错误要throw异常;
2:函数有注释,使用上我给的注释模板
3:要求有main函数。测试编码转换函数的时候,通过文件读写来进行字符串的读写。例如写两个文件,相同的中文,不同的编码。通过文件读到ascii中文,最后输出到utf-8的文件,自己一对比也知道函数转换对不对了
4:一天完成,相互鼓励讨论,不鼓励copy code
最先完成的居然是校友,看来还是有两把刷子(中午了解了下还是学自动控制的),我测试了一下,功能ok,注释ok,异常处理ok。
自己那条思路也赶紧想办法吧。
首先确定数据库设置codepage=1208 codeset=UTF-8。也就是说存储的varchar类型的数据都是utf-8格式的。
通过google搜索:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fcli%2Frzadpfnsenva.htm
但是放到我们的代码中后发现SQL_ATTR_UTF8没有在任何头文件中定义。
后来仔细想想可能有点不对劲,可能是因为我的操作系统的缘故,我win7用的是GBK编码,所以cli接口自动判断给转成GBK编码(ascii编码)了。
但是我写的是后台服务程序,应该是在linux上跑着呢(目前和db2在一台机器上),没准在linux上就没问题了。
查看了下linux系统设置:
/etc/sysconfig/language
RC_LANG="zh_CN.UTF-8"
#include <stdio.h>
#include <sqlcli1.h>
#include <string>
int main( int argc, char **argv)
{
const char* strsqldriver =
"DRIVER={IBM DB2 ODBC DRIVER};DATABASE=**;HOSTNAME=*.*.*.*;PORT=60000;PROTOCOL=TCPIP;UID=db2inst1;PWD=***;";
SQLRETURN cliRC = SQL_SUCCESS;
SQLHANDLE henv;
SQLHANDLE hdbc; //数据库连接
SQLCHAR conn[555];
strcpy((char*) (conn), strsqldriver);
cliRC = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
cliRC = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (cliRC != SQL_SUCCESS)
{
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
SQLDriverConnect(hdbc, (SQLHWND) NULL, conn, SQL_NTS, NULL, 0, NULL,
SQL_DRIVER_NOPROMPT);
if (cliRC != SQL_SUCCESS)
{
SQLFreeHandle(SQL_HANDLE_ENV, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return -1;
}
SQLHANDLE hstmt; //SQL句柄
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR *stmt = (SQLCHAR *) "select COALESCE(address,'') from sm.test";
SQLCHAR val[15];
SQLINTEGER ind;
cliRC = SQLExecDirect(hstmt, stmt, SQL_NTS);
cliRC = SQLBindCol(hstmt, 1, SQL_C_CHAR, val, 15, &ind);
cliRC = SQLFetch(hstmt);
for (int i = 0; i < 6; ++i) {
printf(" %X", *(val+i));
}
cliRC = SQLDisconnect(hdbc);
return 0;
}
输出比较简单,就放俩汉子在数据库字段里面。
果然如想象的一样,windows下和linux下的输出是不一样的。
虽然给新员工的任务排不上用场,但是也不错,先探探虚实嘛,好像也给自己一点小压力,自己貌似刚入职的时候能力还比较差啊。