gpt4 book ai didi

c++ - Firebird 在 `UTF8 string converted to wstring` 上崩溃

转载 作者:行者123 更新时间:2023-11-30 01:57:38 25 4
gpt4 key购买 nike

您好,我是数据库的新手。在这里,我在向表中插入一行时遇到问题。输入的字符串采用 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 但没有成功。谁能告诉我崩溃的原因是什么以及如何解决?

顺便说一句,我使用的是 Firebird 数据库 2.0 版。

UPDATE1:

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

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

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

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

更新 2:似乎我的字符串中的 Ÿ 字符有问题。只要我将它作为字符串发送,如果我完全使用 wstring 就没有问题,它会失败。

我只是在内存中观察到当我将它作为 9f 发送时它是如何表示的 (= Ÿ) 如果我将它作为 9f 发送,SQLExecDirectA 没有问题00 (= Ÿ wchar) 然后它在 SQLExecDirect

上崩溃

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

有什么想法吗??

最佳答案

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

WideCharToMultiByte 的逆运算是 MultiByteToWideChar。虽然不清楚为什么要将字符串从 Unicode 转换为 UTF-8,但只能立即将其转换回来。

关于c++ - Firebird 在 `UTF8 string converted to wstring` 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com