火鸟在“UTF8 字符串转换为 wstring”时崩溃
Firebird crashes on `UTF8 string converted to wstring`
嗨,我对数据库完全陌生。在这里,我在表中插入一行时遇到问题。字符串采用 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
但没有运气。谁能告诉我崩溃的原因是什么以及如何解决?
顺便说一句,我正在使用火鸟数据库版本 2.0。
UPDATE1:
1(如果我不将UTF8字符串转换为wstring并使用SQLExecDirectA
调用它工作正常。但是在这一点上,我不知道副作用,因为该数据库已从很多其他地方访问。
2(我尝试使用isql.exe从命令行推送相同的字符串,没有问题!
我想知道为什么在我的调试器监视列表中没有显示最后一个字符(Ÿ
转换为显示为 159:L''
的 wchar 后此字符。我查了字符集159指的是Ÿ
。知道为什么我的调试器没有将此字符显示为 wchar,而是仅显示为 char 吗?
有没有办法调试SQLExecDirect
?我正在使用 OdbcJdbc 驱动程序。
Update 2:
似乎我对字符串中的Ÿ
字符有问题。只要我将其作为字符串发送,如果我使用 wstring,它就会失败。
我只是在内存中观察到当我将其发送为 9f
(= Ÿ( 时它是如何表示的,如果我将其作为9f 00
发送SQLExecDirectA
(= Ÿ wchar(,那么它会崩溃SQLExecDirect
我的应用程序是使用 Unicode 字符集构建的。Firebird 数据库字符集设置为"无"。
任何想法??
mbstowcs
假定其第二个参数是系统默认代码页中的字符串,也称为 CP_ACP
,它从来都不是 UTF-8(也称为 CP_UTF8
(。
WideCharToMultiByte
的反转是MultiByteToWideChar
.虽然不清楚为什么要将字符串从 Unicode 转换为 UTF-8,只是为了立即将其转换回来。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- Ctypes wstring通过引用传递
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- Windows中的exe在调用getWindowsDirectory时附加wstring时正在崩溃
- 火鸟在“UTF8 字符串转换为 wstring”时崩溃
- 如何在将NULL传递给std::wstring时防止运行时崩溃
- 将字符串转换为wstring时崩溃
- 使用std::wstring导致堆内存分配崩溃