【发布时间】:2020-12-16 20:52:44
【问题描述】:
我正在尝试将一些 UTF-8 字符串插入 PostgreSQL 数据库。我正在使用 Visual C++ 和 MFC(这一点可能并不重要)和项目设置“使用多字节字符集”(尝试在旧的遗留应用程序中切换数据库)。因此,当我使用西里尔文“АБВГ”中的一些文本执行一些 INSERT 命令时,我希望在数据库中看到这个文本,但我看到的是这个(在 DBeaver 中):“ÐÐ'Ð'Г”。我通过将字符串“\xC0\xC1\xC2\xC3”从代码页 1251 转换为 CP_UTF8 来插入此文本。
当我将系统设置“非 Unicode 程序的语言”从英语更改为某些西里尔语(如俄语)时,实际插入的文本不再是“Ð'Ð'Г”,而是“РђР'Р' Р“”。 Postgres ODBC 驱动程序显然使用 CP_ACP 来解释我的多字节字符串。事实上,如果我现在尝试直接插入“\xC0\xC1\xC2\xC3”(不转换为 UTF-8),我确实会在数据库中看到“АБВГ”。但我需要插入 UTF-8 字符串,而不是代码页的子集。
如何指示 Postgres ODBC 驱动程序将我的字符串解释为 UTF-8,并忽略“非 Unicode 程序的语言”系统设置?
在 PSQL 控制台中,server_encoding 和 client_encoding 都设置为 UTF8。
【问题讨论】:
-
对于 cp 1252,您的字符串
ÐБВГ以十六进制编码为 D0,90,D0,91,D0,92,D0,93。当解释为 UTF-8 时,它给出АБВГ。因此,从数据库中获取数据后,您需要将其从 UTF-8 转换为用于显示的代码页。 -
@Daniel 但在数据库中看起来有问题。我无法在查询中使用排序。
-
您有未配对的转化
[input]-->{convert to UTF-8}-->[DB]-->[output]或[input]-->{convert to UTF-8}-->{convert to UTF-8}-->[DB]-->{convert from UTF-8}-->[output],应该是[input]-->{convert to UTF-8}-->[DB]-->{convert from UTF-8}-->[output]。也许您需要检查连接参数或在发送到数据库或查看器使用错误编码之前不转换数据。
标签: c++ postgresql winapi odbc