2013-08-26 30 views
1

嗨,我是完全新的数据库。在这里,我有问题在表格中插入一行。该字符串以Unicode编码并使用WideCharToMultiByte调用转换为UTF8。然后构建如下的数据库查询。火鸟崩溃'UTF8字符串转换为wstring'

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但没有运气。任何人都可以告诉我什么可能是崩溃的原因,以及如何解决?

顺便说一句我正在使用Firebird数据库版本2.0。

UPDATE1:

1)如果我不转换UTF8字符串wstring的,并使用SQLExecDirectA调用它工作正常。但在这一点上,我不知道副作用,因为该数据库一直在其他地方访问。

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

我不知道为什么在我的调试器的观察名单是没有显示的最后一个字符(Ÿ这个字符转换为WCHAR显示为159:L''后,我看了字符集159指Ÿ。任何想法,为什么我的调试器不显示此字符作为WCHAR,但它显示为刚刚字符?

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

Update 2: 好像我有问题我的字符串中有个字符。只要我发送字符串没有问题,如果我使用wstring的话,它就会失败。

我只是在内存中观察到,当我与SQLExecDirectA发送它作为9f(= Y)没有问题,如果我把它作为9f 00(= Y WCHAR)它是如何代表则崩溃于SQLExecDirect

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

任何想法??

+2

我不认为'删除[] buf'会是明智的考虑你永远不会'新'它。只是......哎哟。在那些未定义行为的小宝石之后,指望你的堆被洗净。 pebkac。 – WhozCraig

+0

我同意,我的代码中再也没有这个电话了。 – Vivek

+1

随着'崩溃',你的意思是一个Firebird服务器崩溃,连接关闭,或在您的应用程序崩溃? –

回答

4

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

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