繁体   English   中英

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

[英]Getting UTF-8 data from MySQL to the Linux C++ application

显示从MySQL检索到基于Linux的C ++应用程序的UTF-8数据,我遇到了很大的麻烦。 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');

但没有运气。 测试仍显示为问号。 我用Perl脚本做了一些测试(我对它更熟悉;))。 如果我为连接指定了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的行。

您无需像这样设置charset选项即可获得所需的结果。 他们只是帮助DB做排序等合理的事情。

我怀疑你确实以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显示resetdb放入测试数据库的UTF-8数据。 有关更多详细信息,请参阅分发中的README-examples.txt。

我并没有告诉你切换到MySQL ++,只是将它作为一个已知的工作测试。 一旦你开始工作,你可以修改这些例子以对抗你自己的数据库,看看它是否会中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM