Firebird在`UTF8字符串转换为wstring`时崩溃

时间:2013-08-26 22:08:04

标签: c++ visual-studio-2008 utf-8 firebird

嗨,我对数据库完全陌生。在这里,我在向表中插入行时遇到问题。字符串输入是Unicode,并使用WideCharToMultiByte调用转换为UTF8。然后构建一个数据库查询,如下所示。

in = "Weiß" (UTF8 string result of conversion from Unicode to UTF8)


wchar_t buf[2048]; //= new wchar_t[ in.size() ];
size_t num_chars = mbstowcs( buf, in.c_str(), in.size() );
wstring ws( buf, num_chars );

这里我有字符串ws = 'WeiÃ'如果我展开ws,看到字符串中有5个字符,第5个字符是159:L''

wostringstream oss;
oss << L"insert into myutftable values("
                                       << id
                                       << L"',  '"
                                       << ws
                                       << L") ";

然后我使用SQLExecDirect来更新数据库。这是我看到崩溃的地方。

我试图理解它崩溃的原因。我尝试了一些不成功的事情。我使用character set = utf8但没有运气。任何人都可以告诉我崩溃的原因是什么,以及如何解决?

BTW我正在使用Firebird数据库版本2.0。

UPDATE1:

1)如果我没有将UTF8字符串转换为wstring并使用SQLExecDirectA调用它可以正常工作。但此时我不知道副作用,因为该数据库已从其他地方进行访问。

2)我尝试使用isql.exe从命令行推送相同的字符串,没有问题!

我想知道为什么在我的调试器监视列表中没有显示最后一个字符(Ÿ转换为wchar后显示为159:L''这个字符。我看了字符集159指的是Ÿ任何想法为什么我的调试器没有将这个字符显示为wchar,但它只显示为char?

有没有办法调试SQLExecDirect?我正在使用OdbcJdbc驱动程序。

Update 2: 好像我在我的字符串中遇到Ÿ字符问题。只要我将它作为字符串发送没有问题,如果我使用wstring它会失败。

我刚刚在记忆中观察到当我以9f(=Ÿ)发送它时它是如何表示的SQLExecDirectA如果我发送9f 00(=Ÿwchar)没有问题然后它在SQLExecDirect

上崩溃了

我的应用程序是使用Unicode字符集构建的。 Firebird数据库字符集设置为无。

任何想法??

1 个答案:

答案 0 :(得分:4)

mbstowcs假定其第二个参数是系统默认代码页中的字符串,也称为CP_ACP,它永远不是UTF-8(也称为CP_UTF8)。< / p>

WideCharToMultiByte的倒数是MultiByteToWideChar。虽然目前还不清楚为什么要将字符串从Unicode转换为UTF-8,但只能将其转换回来。