在写一个程序用到了wxWidgets、CGI、MySQL为使用UNICODE头疼了数天。得下心得如下:

考虑到以后的迁移和多语种兼容,在MySQL中全部表和列包括整个数据库均使用UNICODE。MySQL++做数据库操作。wxWidgets用的UNICODE的编译版本。CGI用的cgicc3.2.7。用户段用的cURL库做提交和获取CGI相应工具

先是数据库

my.ini已经有了

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8 (数据库缺省以utf8存储)

使用

wxString qStr(wxT("UPDATE table SET chinese_text = '中文' WHERE uid = 2"));
mysqlpp::Query query1 = m_pConnection->query(qStr.utf8_str());
query1.store();

保存到数据库后依然是乱码!很奇怪。最后发现只要在执行query()前再加一条 query("SET NAMES UTF8"); 问题立刻解决。很诡异。

其次是CGI

不管使用何种格式直接提交 http://www.mysite.com/cgicc_test.exe?name=中文 。cgicc获取到的name字段信息均为乱码。只能将中文信息做urlencode再上传才行

最终的方案为:

cilent(wxWidgets)

  • 将需要提交的中文内容先转换为UTF-8然后再转换为%DD的格式,然后以ANSI编码的方式用cURL提交
  • CGI(cgicc)收到即为UTF-8编码格式。传给一个封装后的sql类
  • sql类中进行sql语句拼装
  • 最后扔给MySQL++执行

成功