从MySQL获取UTF-8数据到Linux C ++应用程序

从MySQL检索到的UTF-8数据显示到基于Linux的C ++应用程序中,我遇到了很大的麻烦。 UTF文本显示为问号。

该应用程序使用MySQL C API。 所以我在mysql_init()mysql_real_connect()之前传递了UTF-8选项:

 mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

 mysql_options(&mysql,MYSQL_INIT_COMMAND, 'SET NAMES utf8'); 

但是没有运气。 testing仍然显示为问号。 我用Perl脚本做了一些testing(我更熟悉它))。 如果我为连接指定了UTF-8选项,文本将正确显示:

 $dbh->{'mysql_enable_utf8'} = 1; $dbh->do('SET NAMES utf8'); 

任何想法如何在C ++应用程序中正确显示UTF-8数据?

这可能是一个简单的错字。 你写:

 mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

单引号用于指定字符文字,而不是字符串。 所以,改变:

 mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

另外,检查mysql的类型。 如果是MYSQL * ,则写入:

 mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

这同样适用于MYSQL_INIT_COMMAND行。

你不需要像这样设置字符集选项来获得你想要的结果。 他们只是帮助数据库做排序等合理的事情。

我怀疑你确实是以UTF-8格式获取你的数据,但是没有正确处理它。 在C中传递UTF-8是世界上最简单的事情。 让它正确打印可能是一个更大的挑战,但当然这不是MySQL的问题。

根据你对这篇文章的标签,我假定你正在Linux上运行这个程序。 如果是这样,你应该简单地把它打印到控制台(printf(),cout,不管),以获得正确的表示,因为Linux控制台现在几乎总是默认为UTF-8。 检查你的LANG环境变量。

在处理Unicode时,编写只包含非常少量非ASCII数据的测试程序(单个字符最好)只打印出来,并将该程序的输出重定向到一个文件会很有帮助。 然后在十六进制编辑器中查看该文件,并至少与UCS-2LE进行比较,看看是否只是看到错误的编码。

我是MySQL ++的维护者,可以告诉你,MySQL ++在Linux上很自然地处理UTF-8,但是我们不玩任何游戏来实现它。 我不明白为什么直接的C API代码不应该表现得自然。 您可以尝试在您的系统上构建MySQL ++并运行示例,因为它们包含UTF-8测试。 运行resetdb进行设置,然后使用simple1显示重新编译放入测试数据库的UTF-8数据。 有关更多详细信息,请参阅发行版中的README-examples.txt。

我没有告诉你切换到MySQL ++,只是使用它作为一个已知的工作测试。 一旦你得到它的工作,你可以修改这些例子对付自己的数据库,看看它是否打破。