c++ - 如何将 unicode 转换为 ebcdic CCSIDs-1025 并写入 db2
问题描述
我的问题是输入是一个带有UTF-8编码的 XML 文件。
该数据库使用CCSIDs-1025 (DB2) 进行编码。
应用程序本身是windows-1251编码的。
解析 XML 后,我将数据保存到常规 char 数组中。当然,在我的系统中,没有用于 Unicode 转换的映射,并且该数组存储了正确的字节表示,但是像这样:“RњRRќRR •R RЎRR'Rћ PYPyPPŽPP RR•RРRЈR'R›RRR RR•R›RR RRR€ RR ™R†R"
这不是一个问题。我可以将其转换为 windows-1251 并使用 ebcdic 将其正确写入 DB2 或在我的代码中工作。
但!
在写入表之前是否可以直接将 unicode 转换为 EBCDIC?
我找到了一个有用的仪器ICU4C并尝试将“Moscow”(Москва)转换为 EBCDIC CCSIDs-1025。
```lang-cpp
// CONVERTION USING ICU
UChar source[] = { 0x041C, 0x043E, 0x0441, 0x043A, 0x0432,
0x0430, 0x0021, 0x0000 };
char target[100];
UErrorCode status = U_ZERO_ERROR;
UConverter *conv;
int32_t len;
// set up the converter
//! [ucnv_open]
conv = ucnv_openCCSID(1154, UCNV_IBM, &status);
//! [ucnv_open]
assert(U_SUCCESS(status));
// convert to EBCDIC-1154.
len = ucnv_fromUChars(conv, target, 100, source, -1, &status);
assert(U_SUCCESS(status));
```
它再次正确转换。并且符号代码对应于目标CCSID。
\xCF \x9E \xAB \x9A \xAF \x77 \x4F - 这是结果。但是我如何存储结果并将其插入到具有正确映射的表中?它仍然从 windows-1251(我的应用程序编码)和映射为"ПћљЇwO"的"Москва"中获取符号。我如何让 DB2 使用 CCSIDs-1025 中的字符。
我还在 C++ 应用程序中使用嵌入式 SQL 和主机变量。我可能需要在绑定期间设置主机变量的编码吗?
谢谢!
解决方案
@Dastin_DV 关于您对嵌入式 SQL 和主机变量的 CCSID 以及您的应用程序处理的数据编码方案的问题,我想在这里进一步解释。
在 Db2 for z/OS 应用程序中,一个 CCSID 与源代码相关联,一个或多个 CCSID 可以与您的应用程序操作的数据相关联。Db2 与数据关联的 CCSID 称为应用程序编码方案。
有一些一般规则:
对于在 SQL 语句中包含 SQL 语句和文字字符串的应用程序源代码,如果您使用 Db2 预编译器,则在预编译应用程序时使用 CCSID SQL 处理选项,在编译应用程序时指定相同的 CCSID;如果您使用 Db2 协处理器,请使用语言编译器来设置 CCSID。
对于应用程序数据,例如通过主机变量和参数标记传递的值,在 SQL 语句中,使用以下一种或多种 Db2 机制来设置应用程序数据的 CCSID 值,称为应用程序编码方案
- 使用 ENCODING 绑定选项。2.c 此选项通常会产生最佳性能。
- 通过使用带有 CCSID 选项的 DECLARE VARIABLE 语句来覆盖特定主变量的 CCSID。
- 通过指定 CURRENT APPLICATION ENCODING SCHEME 特殊寄存器来覆盖动态 SQL 中参数标记的 CCSID。Db2 在执行语句时使用此特殊寄存器的值
对于在 SQL 语句之外引用的应用程序数据,使用编程语言的规则,在某些情况下,此数据的 CCSID 与源代码的 CCSID 相同。
推荐阅读
- javascript - 在 CKEditor5 中插入自定义元素
- c++ - 如何使功能“运行”工作。调用 run 时程序仅退出
- elixir - 如何在 Elixir 中刷新过期的 Guardian 访问令牌
- common-lisp - 如何在 Common Lisp 中内联函数
- scrollview - SwiftUI ScrollView:如何修改 .content.offset aka Paging?
- google-apps-script - 谷歌脚本在importrange上过滤掉整个工作表的不需要的字符
- sql - 如何获取活跃员工的数量(所有月份)
- isabelle - 表示具有粘合条件的集合
- java - 创建带有嵌套循环的while循环
- azure - 如何对 Azure 数据工厂进行 QA 测试?