2

我目前正在开发一个用 C++ 编写并使用带有 MS Access 后端的 True OLE DBGrids 的项目。这一切都很好,直到现在我们需要能够将我们的 GUI 转换为显示阿拉伯字符。DBGrids 不使用 Unicode,所以我需要一种方法来显示数据库中的字符而不使用 Unicode。目前我已将区域语言设置设置为阿拉伯语,当我这样做时,我可以强制网格显示阿拉伯语字符,但我不能通过代码来做到这一点。我需要能够在运行时在英语和阿拉伯语之间切换。我可以将数据从数据库中提取出来,然后使用以下代码将其转换为非 Unicode:

_bstr_t tmp(vHolder.bstrVal, FALSE);   //wrap the BSTR
CString Caption(static_cast<const char*>(tmp));  //convert it
RetCaption = Caption;

有了这个,我可以将阿拉伯语发布到 AfxMessageBox 并正确显示,但我似乎无法让网格接受非 Unicode 字符并正确显示它们。

有任何想法吗?

4

1 回答 1

1
CString Caption(static_cast<const char*>(tmp));  //convert it

那不会转换它。如果tmp包含英文文本,它将生成单个字符。如果它包含阿拉伯文字,那么来自吉伯之地的一句俗语。从 OLE 自动化和您正在使用的 DBGrid 使用的 UTF-16 转换为 8 位字符无法通过强制转换完成,它需要一个转换函数。像 WideCharToMultiByte 或 OLE2A。

只有当线程的代码页与字符串中使用的字符集匹配时,这种转换才会重现清晰的文本。其中,如果网格显示阿拉伯语并且您的线程或您转换为的代码页是英语,则只会产生一堆问号。

如果你不想让你的代码启用 Unicode,那么你就不能在字符集之间动态切换。您运行此代码的操作系统在过去 17 年中一直支持它。

于 2010-07-01T21:25:23.033 回答