0

我从事为 MSVCC / Windows 编写的项目,我必须移植到 GCC / Linux。该项目有自己的字符串类,它将其数据存储在来自 Qt 的 QString 中。为了转换为 wchar_t*,最初有这种方法(适用于 Windows):

const wchar_t* String::c_str() const
{
    if (length() > 0)
    {
        return (const wchar_t*)QString::unicode();
    }
    else
    {
        return &s_nullString;
    }
}

因为 unicode() 返回一个 QChar (它是 16 位长),这在 Windows 下工作,因为 wchar_t 在那里是 16 位,但现在使用 GCC wchar_t 是 32 位长,所以它不再工作了。我试图用这个来解决这个问题:

const wchar_t* String::c_str() const
{
    if ( isEmpty() )
    {
        return &s_nullString;
    }
    else
    {
        return toStdWString().c_str();
    }
}

这样做的问题是,当这个函数返回时,对象不再存在,所以这也不起作用。我认为解决这个问题的唯一方法是:

  1. 不要使用 String::c_str() 并直接调用 .toStdString().c_str()
  2. 让 GCC 将 wchar_t 视为 16 位类型

可能性一对我来说意味着几个小时的不必要的工作,我不知道可能性二是否可能。我的问题是,如何最好地解决这个问题?我会很感激任何有用的建议。谢谢你。

4

1 回答 1

0

在我看来,有两种方法:

  1. 需要时将 QString 转换为 wchar_t*
  2. 让 QString 存储 wchar_t* 并直接返回 QString::unicode

这两个函数可以将 QString 转换为 std::string 和 std::wstring
QString::toStdWString
QString::toStdString

将 QString 构建为 ucs4 :

#define QT_QSTRING_UCS_4
#include "qstring.h"

这可以在 qt3( qstring.h ) 中使用。我找不到qt4的来源。

于 2009-12-07T16:59:21.260 回答