字符编码在哪里改变?

Where does character encoding change?

我有一个 MySQL 数据库,其中 table 的条目带有重音符号,例如 "João".

条目是在 C/C++ 代码中使用 MySQL++ 查询选择的,但该条目特别打印为 "Jo�o" (printf, fprintfstd::cout <<).

我想了解的是:这个字符在数据流中的哪个位置编码不正确?

更多上下文:前端是 HTML/PHP,它使用 PDO 将数据插入 MySQL 数据库。

我在 HTML 中看到使用 PDO 查询正确显示的字符。它也可以正确显示:

mysql> select * from <table>;

所以我认为它在 table 中写得很好。问题似乎在于 MySQL++ 查询或 C/C++ 输出命令。

我不知道它是否相关,但是 MySQL 的 table 编码是 utf8_general_ci 并且 shell 语言环境是 LANG=en_US.UTF-8

我从这个 post 得到了答案:http://forums.mysql.com/read.php?167,243667,243695#msg-243695

问题出在 MySQL++ 上。创建连接后,我们需要执行:

mysqlpp::Query query = connection->query("SET NAMES 'utf8'");
query.execute();