今日免费次数已满, 请开通会员/明日再来

5

假设项目的编码可能是Unicode(但不确定),将ATL :: CString转换为QString的最佳方法是什么?

我想到的方法是:

CString c(_T("SOME_TEXT"));
//...
std::basic_string<TCHAR> intermediate((LPCTSTR)c);
QString q;

#ifdef _UNICODE 
q = QString::fromStdWString(intermediate);
#else
q = QString::fromStdString(intermediate);
#endif

你认为这个方案可行吗?还有其他想法吗?

实际上不行,因为出于某种原因我无法链接。在尝试链接之前,我想问一下我是否正确。 - Hayri Uğur Koltuk
1个回答

9
您不需要将其转换为std :: stringCString类可以被视为简单的C风格字符串;也就是字符数组。您只需要将其强制转换为LPCTSTR即可。
一旦您拥有了这个,您只需要根据您的CString中的字符是char类型还是wchar_t类型创建QString对象。对于前者,您可以使用 QString的标准构造函数之一,而对于后者,则可以使用fromWCharArray函数
类似以下代码(未经测试,我不再安装Qt):
CString c(_T("SOME_TEXT"));
QString q;

#ifdef _UNICODE 
q = QString::fromWCharArray((LPCTSTR)c, c.GetLength());
#else
q = QString((LPCTSTR)c);
#endif

编辑: 根据评论中的建议,您需要在项目属性中禁用“将 wchar_t 视为内置类型”,以使上述代码在 Visual Studio 中正确链接(来源)。

对于 _UNICODE,我认为您也可以使用fromUtf16 函数

CString c(_T("SOME TEXT"));
QString q = QString::fromUtf16(c.GetBuffer(), c.GetLength());

有没有关于为什么QString :: fromWCharArray无法链接的想法?奇怪的是,这是链接器找不到的唯一函数... - Hayri Uğur Koltuk
@Ali:也许你正在使用一个不包含该函数的旧版本Qt?当你留下那个评论时,我又添加了另一种可能的解决方案。你可以尝试一下那个。 - Cody Gray
不,我找到原因了。它在这里:http://www.qtcentre.org/threads/4625-WCHAR-to-QString-giving-error-in-vs2005。 - Hayri Uğur Koltuk
@Ali:很有趣,我从来没有想到过。但我仍然不确定为什么这是必要的。我猜VS编译器对wchar_t的处理方式与Qt的期望不同。 - Cody Gray
是的,我也这么认为。我猜wchar_t是一些typedef,当它是内置类型时,链接器会寻找接受内置类型参数而不是typedef类型参数的函数。我相信这就是为什么它无法链接的原因。 - Hayri Uğur Koltuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接